javascript - 为什么返回 3, 1?

标签 javascript

后来我明白了,我们在 foo 对象上调用警报,该对象有另一个名为 baz 的对象作为其属性,而该对象又有一个名为 的方法>bar 返回 x 的值。由于 lexical scope(我认为 :)),JS 编译器/解释器沿链向上,在 baz 中找到 x 并返回 1。

我的猜测是当分配给变量 go 然后从全局范围调用时,你得到 3?只是想找出后台发生的事情。任何帮助将不胜感激!!!

var x = 3;

var foo = {
    x: 2,
    baz: {
        x: 1,
        bar: function() {
            return this.x;
        }
    }
}

var go = foo.baz.bar;

alert(go());
alert(foo.baz.bar());

最佳答案

当你做这样的事情时:

var go = foo.baz.bar;
go();

你会发现 go 在调用 bar() 之前丢失了对 foo.baz 的引用。它只是一个指向 bar 函数的指针,与它所附加的对象没有任何关联。这意味着当 bar 方法执行时,this 将不是 foo.baz

这显然是 .bind() 的开发目的。你可以像这样使用它:

var go = foo.baz.bar.bind(foo.baz);
go();

然后,它将为您工作。您也可以执行相同操作的手动版本:

var go = function() {return foo.baz.bar();}
go();

但是 .bind() 现在已内置到语言中以帮助您解决此类问题。

关于javascript - 为什么返回 3, 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28479754/

相关文章:

javascript - 如何制作有效的多行 Javascript REGEX

javascript - 如何测试 Dojo/Javascript 树延迟加载是否正常工作?

javascript - eclipse javascript 编辑器 '10

javascript - 将当前 URL 文件名添加为 div 内的类

php - 边栏 Google Maps API v3 使用 PHP/MYSQL 提取数据

java - javascript 内容占位符问题中的第二个 css

javascript - Safari - HTML5 音频不会在下一个流中自动播放

javascript - 通过 jQuery 从 jSTL 文本字段获取值

Javascript 抛出错误 is null 或 not an object

javascript - 在 JS 中打印未更改的字符串