var inner = function() { console.log(x); }
// test 1
(function(cb) { var x = 123; cb(); })(inner);
// test 2
(function(cb) { var x = 123; cb.apply(this); })(inner);
// test 3
(function(cb) { var x = 123; cb.bind(this)(); })(inner);
// test 4
(function(cb) { cb.bind({x: 123})(); })(inner);
所有测试结果如下:
参考错误:x 未定义
有人知道如何在回调中将“x”作为局部变量访问吗?
事实:当你这样做时var inner = function() { console.log(x); }
在你的第一行中,x
没有定义。为什么?因为,在你的内心inner
函数中,没有 x 的本地声明(这可以通过var x = something
)。然后,运行时将在下一个作用域中查找,即全局作用域。也没有声明x
, so x
那里也没有定义。
唯一有一个名为的变量的地方x
位于以下 4 个 IIFE 的每一个内。但在 IIFE 内部,每个x
是一个不同的变量,在不同的范围内。所以,如果你想要的是console.log()
the x
在每个 IIFE 中定义,您采取了错误的方法。
请记住,当您定义inner
,您正在捕获函数闭包内的环境。这意味着,无论什么值都可以x
在那里(在函数的声明中),将是可用的值x
稍后变量,当inner
将使用函数。事实是你的x
没有定义只是一个附件,并不是导致不良行为的原因。
所以,当你打电话给你的inner
在您的任何 IIFE 中运行,x
里面提到的inner
函数声明是捕获的值x
当函数有一个值被定义,不是那个值x
现在已处于该函数当前所在的范围内被叫。这就是所谓的词汇范围.
要解决这个问题,您必须传递您想要的值console.log()
在 - 的里面inner
函数作为参数inner
函数,如下:
var inner = function(x) { console.log(x); }
// test 1
(function(cb) { var x = 123; cb(x); })(inner);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)