Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript失败(这个。*指示错误),为什么_Javascript_Oop_Conceptual - Fatal编程技术网

Javascript失败(这个。*指示错误),为什么

Javascript失败(这个。*指示错误),为什么,javascript,oop,conceptual,Javascript,Oop,Conceptual,在对象内创建指向函数的指针时 “此”未正确解决 请尝试此示例以获取概念 // this.* fail a = { x : 123, f : function(){ console.log( this.x ) } } a.f() // 123 b = a.f // b points to a.f now b() // should print 123 but gaves 'undefined' 当然,我们可以使用对象名而不是“this”强制解析 但是我们失去了函数性

在对象内创建指向函数的指针时 “此”未正确解决
请尝试此示例以获取概念

// this.* fail
a = { x : 123,  f : function(){ console.log( this.x ) } }
a.f()     // 123
b = a.f   // b points to a.f now
b()       // should print 123 but gaves 'undefined'
  • 当然,我们可以使用对象名而不是“this”强制解析
    但是我们失去了函数性
在实例上调用方法时,方法的上下文就是实例(执行
a.f()
时,
f
方法中的
this
关键字是对
a
的引用)

但是,当您在变量中保留对函数的引用时,在调用它时,实际上会丢失上下文,因此
将成为全局上下文(在浏览器中是
窗口

因此,在调用函数时,需要通过
call
apply
方法为函数提供上下文:

您的代码变成:

b = a.f;
b.call(a); // or b.apply(a)

功能上下文

在函数内部,其值取决于函数的运行方式 打电话来

简单通话

function f1(){
  return this;
}

f1() === window; // global object
这就是您在第二种情况下所做的
b()
。您基本上是在全局对象上调用x。所以

var x = 456;
// this.* fail
a = { x : 123,  f : function(){ console.log( this.x ) } }
a.f()     // 123
b = a.f   // b points to a.f now
b()       // prints 456

作为对象方法

当函数作为对象的方法调用时,它的this设置为 调用该方法的对象

在下面的示例中,当调用o.f()时,在函数内部 这是绑定到o对象的

var o = {
  prop: 37,
  f: function() {
    return this.prop;
  }
};

console.log(o.f()); // logs 37

这是第一种情况下发生的情况。

您可以使用
bind

b = a.f.bind(a);
b(); // 123
发件人:

bind()方法创建一个新函数,当调用该函数时, 将其this关键字设置为给定的值,并具有给定的序列 调用新函数时,在任何参数之前提供的参数


您可以尝试将其分配给对象中的某个变量:

var a = {
   x : 1,
   self : this,
   f : function() {
      self.x++;       
   },
   show : function() {
      alert(self.x);
   }
}

a.f();    
a.show();      

d = a.show;
d();     

拨弄或使用
bind
这完全取决于函数的调用方式,也不一定是全局上下文。