Javascript 如何将this关键字声明为对象内部定义的函数?

Javascript 如何将this关键字声明为对象内部定义的函数?,javascript,javascript-objects,Javascript,Javascript Objects,我对JavaScript语言的OO范式非常陌生(我来自Java),我对thisparam在这种特定情况下的正确含义有以下疑问 我有以下代码: var obj = { fn:function(a,b) { log(this-); } } 好的,据我所知(如果我做了错误的断言请纠正我),前面的代码定义了一个ob对象,其中包含一个名为fn的fnction 第一个疑问:这样做是在创建这个对象的实例(在内存中创建)还是只声明它(作为Java类) 我想我在内存中创建了这

我对JavaScript语言的OO范式非常陌生(我来自Java),我对thisparam在这种特定情况下的正确含义有以下疑问

我有以下代码:

var obj = {

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

}
好的,据我所知(如果我做了错误的断言请纠正我),前面的代码定义了一个ob对象,其中包含一个名为fn的fnction

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

我想我在内存中创建了这个对象的一个特定实例,但我不确定这个

好的,那么做:

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

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


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

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

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

1) 默认绑定:默认情况下,它绑定到全局对象

var a = 10; // declared in global scope

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

foo(); // callsite 
2) 隐式绑定:它绑定到调用其方法的对象

var a = 10; // global

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

obj.foo(); // callsite
3) 显式绑定:它绑定到您指定的任何对象。 有两种方法可以做到这一点,call()和apply()


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

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

1) 默认绑定:默认情况下,它绑定到全局对象

var a = 10; // declared in global scope

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

foo(); // callsite 
2) 隐式绑定:它绑定到调用其方法的对象

var a = 10; // global

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

obj.foo(); // callsite
3) 显式绑定:它绑定到您指定的任何对象。 有两种方法可以做到这一点,call()和apply()


我认为你是对的。如果对象中没有声明
fn
,我相信
这个
与拥有代码的函数有关,所以
fn
就是这个。如果它不在函数中,
this
将引用
窗口
global,如果它在那里。用
this
关键字在哪里声明函数并不重要,重要的是在
obj.fn(…)中调用
obj
。我认为您是正确的。如果对象中未声明
fn
,我相信
与拥有代码的函数相关,因此
fn
就是此。如果它不在函数中,
this
将引用
窗口
global,如果它在那里。用
this
关键字在哪里声明函数并不重要,重要的是在
obj.fn(…)中调用
obj
。还有一条规则可能重复-在函数调用之前使用new关键字。有很多,例如,您忘记了
new
。另外,
foo()
不会将
绑定到全局对象,而是将其绑定到
未定义的
-只有邋遢模式函数默认将其绑定到全局对象。在使用Javascript函数时,这指的是当前对象,具体取决于函数的上下文
至少
拼写还有一条规则-在函数调用之前使用new关键字。例如,有很多规则你忘记了
new
。另外,
foo()
不会将
绑定到全局对象,而是将其绑定到
未定义的
-只有邋遢模式函数默认将其绑定到全局对象。在使用Javascript函数时,这指的是当前对象,具体取决于函数的上下文<代码>至少拼写