javascript - 比较 Javascript 范围

标签 javascript scope

以下部分:

var obj = {
    name:'Tom',
    sayHello:function() {
        console.log("hello," + this.name);
    }
}
var name = 'Kevin';

var method = obj.sayHello;
method();

将得到输出:

hello,undefined

但是,如果将 var name = 'Kevin'; 更改为 name = 'Kevin'; 输出将为 hello,Kevin。为什么它们不同?

最佳答案

答案有两部分:

  1. 当您使用var method = obj.sayHello;时,您正在将函数与obj解耦。当您调用 a 方法而不给它一个显式对象(即 method() 而不是 obj.sayHello())时,JavaScript 会设置 this 到全局对象,window

  2. 当您使用var name = 'Kevin'定义变量时,您正在创建一个具有函数作用域的局部变量。当您使用 name = 'Kevin' 定义变量时,您将创建一个附加到全局对象 window 的全局变量。这与编写 window.name = 'Kevin' 相同。

这两件事结合起来意味着,在 sayHello 中,thiswindowthis.name凯文

要解决此问题,您需要使用 bind,它返回方法的副本,其上下文固定为作为 bind 参数提供的对象:

var method = obj.sayHello;
new_method = method.bind(obj);
new_method(); // hello, Tom

关于javascript - 比较 Javascript 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21037404/

相关文章:

javascript - 如何设置一系列setHeader的DRY

javascript - WebRTC 需要特定的信令服务器软件吗?

javascript - 将字符串转换为脊椎大写

javascript - 使用 Syn.js 的事件监听器未触发鼠标事件

javascript - 限制位于 Service Worker 范围内的文件夹

javascript - 这段代码似乎没有按顺序触发?

javascript - 使 php 中的变量具有外部作用域

javascript - jQuery克隆()问题: clone input without value

javascript - 为什么外部变量在 if 条件中不可用

JavaScript 无法在 ExtJS 5 中获取对表单的引用