Javascript - 在非严格模式下绑定`this`

时间:2016-08-31 05:04:17

标签: javascript this

在下面的学习者代码段中,根据以下理解,在下面的foo()调用,"bar1"关键字绑定到全局基于this规则和严格模式下的default binding

undefined

然而,在调用function foo(){ console.log(this.bar); } var bar = 'bar1'; var o1 = {bar: 'bar2', foo: foo}; var o2 = {bar: 'bar3', foo: foo}; foo(); // expect 'bar1' - default binding o1.foo(); // expect 'bar2' - implicit binding o2.foo(); // expect 'bar3' - implicit binding 时,我在控制台中获得了foo()undefinedo1.foo()基于o2.foo()按预期行事。在我看来,绑定正在按预期工作,但bar变量永远不会停留在全局。

我在节点6中运行了脚本

implicit binding

注意: - 在浏览器中,它给出了预期的输出。

1 个答案:

答案 0 :(得分:2)

那是因为Node模块在它们自己的闭包中运行,所以<script type="text/javascript"> //this function must be in header tag function hasError(argument) { alert(argument == 'error'); } </script> <script src="js/tweenmax.js" onerror="hasError('error')"></script> <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" onerror="hasError('error')"> <img src="djffjds.jpg" onerror="hasError('error')"> 实际上是创建一个局部变量,而不是全局变量。

节点模块基本上是这样包装的,因此它们不会在全局范围内运行。

var bar

如果您在没有function (exports, require, module, __filename, __dirname) { /*your code here*/ } bar = 'bar1';的情况下执行var,您将创建一个全局变量,并获得预期的输出。但实际上并没有在生产中这样做,它污染了全球空间。