今天被javascript的作用域搞混了,请各位帮我看下这段代码
<script type="text/javascript" src="//cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var test = function () {
console.log('hello');
}
var i = 1;
$.each([2], function() {
console.log(i);
setTimeout('test()', 1000);
})
})
</script>
这段代码提示ReferenceError: Can't find variable: test
但是当把$(document).ready(function()删掉或者把var test改成test,即不用var的时候,运行就正常了,可是变量i不管有没有var都是可以获取得到的,这是什么原因?
setTimeout
的第 1 个参数如果不是函数,在 Node6 里会报错在浏览器里不报错,不过估计是用 eval 执行的,所以做个实验
结果输出
hello
,很正常。考虑到你提到的问题,跟作用域有关,把代码稍改一下
报 test 未定义。所有运行如下
从上面实验可以说明:
setTimeout
的第一个参数是文本的时候,是通过window.eval()
执行的。这个时候由于你的var test()
未定义在 windows 作用域,所以报未定义错误。如果不加var
,test()
是在全局(也就是 window 作用域)内定义的,就可以找到并执行。