javascript - 在对象内部定义的函数中声明的 this 关键字究竟如何工作?

标签 javascript javascript-objects

我对 JavaScript 语言的 OO 范式相当陌生(我来自 Java),并且我对这个特定情况下 this 参数的正确含义有以下疑问。

我有以下代码:

var obj = {

    fn:function(a,b) {
        log(this-);
    }

}

好的,根据我的理解(如果我做错了断言,请纠正我),前面的代码定义了一个 ob 对象,其中包含一个名为 fn 的函数。

第一个疑问:这样做是我创建该对象的实例(在内存中创建)还是只是声明它(作为 Java 类)?

我认为我正在内存中创建该对象的特定实例,但我不确定......

好的,然后做:

obj.fn(3,4);

这里的this值是我调用fn()函数的特定obj对象(实例)的标识.

我的推理正确还是我遗漏了什么?

如果我不将 fn() 函数声明到对象定义中会发生什么?如果我直接将其放入 .js 文件中会发生什么? this关键字是否引用了全局对象?

最佳答案

第一个疑问:是的,您正在内存中创建一个对象

据我所知,至少有 3 条规则用于确定 this 关键字的值,所有这些规则都是根据调用函数的调用点确定的.

1) 默认绑定(bind):默认情况下,this 绑定(bind)到全局对象。

var a = 10; // declared in global scope

function foo(){
 console.log(this.a); // 10
}

foo(); // callsite 

2) 隐式绑定(bind):this 绑定(bind)到调用其方法的对象

var a = 10; // global

var obj = {
  a : 20,
  foo : function(){
         console.log(this.a); // 20
        }
  }

obj.foo(); // callsite

3) 显式绑定(bind):this 绑定(bind)到您指定的任何对象。 有两种方法可以做到这一点,call() 和 apply()

var a = 10;

var obj = {
   a : 20
};

function foo(){
   console.log(this.a); // 20
};

foo.call(obj); // bind to obj

关于javascript - 在对象内部定义的函数中声明的 this 关键字究竟如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39350595/

相关文章:

javascript - 在 JavaScript 中迭代对象的一组已过滤属性的最佳方法是什么?

javascript - ReactJS 与谷歌标签管理器

javascript - Jquery 提交更改值的表单

javascript - 递归地将 JavaScript 对象拟合到特定结构

javascript - 如何使此函数不返回负的日期差?

javascript - 如何使用 Angular 将新对象添加到现有动态响应

javascript - 使用 REGEX 匹配用户输入

javascript - 使用 javascript 或 jquery 编辑浏览器的查询字符串

javascript - 使用 Javascript 动画库 VS 创建要在标题中注入(inject)的动态 <style> 标签

javascript - 将属性 javascript 合并到新对象中