javascript - js匿名函数作用域问题
巴扎黑
巴扎黑 2017-04-10 17:27:20
[JavaScript讨论组]

问题已经解决,属于个例问题;不具有普遍参考性
代码如下:

(function(){
    var loginForm = document.forms.loginForm;
    var login_inputs = loginForm.getElementsByTagName('input');
    ...
    login_inputs .forEach(function(item,index,array){});
})()

代码中报错:
login_inputs is not defined
login_inputs .forEach is not a function

loginForm测试正常
开发工具sublime




    
    Document
    


    
手机号码登录

巴扎黑
巴扎黑

全部回复(6)
天蓬老师
(function(){
    var login_inputs = loginForm.getElementsByTagName('input');
    ...
    login_inputs.forEach(function(item,index,array){});
})()

以上代码再执行前
如果loginForm未定义过,报 ReferenceError: Can't find variable: loginForm
如果loginForm定义过并且是一个DOM元素,那么login_inputs为一个NodeList对象,这个对象没有forEach方法的,所以会报forEach is not a function
想要使用Array的forEach方法,使用函数的call/apply方法

Array.prototype.forEach.call(login_inputs, function( item,index,array ){
  console.log(item);
});
天蓬老师

一般来说,xxx is not defined会出现在变量未声明之前就使用的场景。

但是,重点来了,单看题主的这段代码却永远不可能出现login_inputs is not defined,因为最开始的地方已经用了var进行声明……

var login_inputs = loginForm.getElementsByTagName('input');

所以,应该是其他地方错了吧

高洛峰

你在chrome按F12调试一下看看,在声明login_inputs这后面先console一下看看这个得到的是什么东西,然后console.log(typeof X)看看它的类型是不是数组,你下面用到了遍历数组,然后你在你js中打断点调试下看看,你发了两句代码,具体哪里问题,我也说不准,不过首先,我一般声明数组的话,会var a = new array(); 这样写,看看是不是这个的问题

ringa_lee

你这里要用闭包,就访问不到loginForm了。

应该这样写:

(function(loginForm){
    var login_inputs = loginForm.getElementsByTagName('input');
    ...
    login_inputs .forEach(function(item,index,array){});
})(loginForm)
PHP中文网

已经解决问题,当匿名函数执行完;变量应该就被销毁了。
谢谢大家帮我解决问题。

大家讲道理

输出一下loginForm?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号