函数中的“this”上下文

时间:2017-10-22 10:47:30

标签: javascript data-structures

在以下代码中,我无法理解有关this

的一些内容
function Stack() {
  let items = [];
  push = function(element){
   items.push(element);
 };

 this.pop = function(){
  return items.pop(); // removes and returns the element.
 };
}
let stk= new Stack();
stk.push(); // 1 
stk.pop(); //  no error
  1. throws stk.push不是函数。为什么?为什么缺少this会阻止推送方法。
  2. 为什么它必须是new Stack(),为什么不能let stk= Stack()来识别函数内部的方法?
  3. 因为我正在实例化Stack函数,不管方法是否用this声明, stk var应该能够访问函数,不是吗? / p>

2 个答案:

答案 0 :(得分:1)

让我们看两个例子:

push = function() { /*...*/ }

var push = function() { /*...*/ }

在第一个push中是一个全局变量。 因此,我们不会定义Stack.push push之类的内容。 所以,你这样做:

push();

它已经执行但当然失败了!

在第二个变量中,变量是本地范围的,这意味着它只能在Stack函数中使用。

因此,在这种情况下,推送在Stack之外的任何地方都是未定义的。

未定义pushStack.push以及stk.push

现在让我们看看其他选项:

this.push = function() { /*...*/ }

这定义了当前对象的字段push

让我们澄清一下:

let Stack = function() {
     this.push = function() { console.log("Hello!"); }
     console.log(this);
};
Stack();

所以我们得到的是:

  

Window {frames:Window,postMessage:ƒ,blur:ƒ,focus:ƒ,close:ƒ,...}

等什么?这意味着函数的上下文(this)是Window对象。 所以在这种情况下(如果我们在浏览器中工作)我们再次定义 全局 变量push

let Stack = function() {
     this.push = function() { console.log("Hello!"); }
};
Stack();
push();

输出

  

您好!

现在救援来了new关键字。 基本上Mozilla文档说:

  

当执行代码new Foo(...)时,会发生以下情况:

     

创建一个新对象,继承自Foo.prototype。   使用指定的参数调用构造函数Foo,并使用   这绑定到新创建的对象。   new Foo相当于新的Foo(),   即如果没有指定参数列表,   Foo被调用而没有参数。

     

构造函数返回的对象成为整个新表达式的结果。如果构造函数未显式返回对象,则使用在步骤1中创建的对象。

     

(通常构造函数不返回值,但是如果他们想要覆盖正常的对象创建过程,他们可以选择这样做。)

就是这样! 新关键字将this绑定到newly created object

所以当我们执行

new Stack()

this关键字指的是我们创建的对象!这就是我们分配时的原因

this.push = /* Something */

可以理解为如下代码:

// Create new stack object
var stack = /* This is done by the 'new' keyword */ 

// Run our code
stack.push = /* Something */

如此低音就是这样!希望它可以帮助你:)

答案 1 :(得分:1)

函数是一个对象, this 是指对象的特定实例。

如果在没有 this 的函数中有函数,则它是函数的本地函数。

使用 this ,内部函数成为对象的一个​​方法,可以调用它来执行某些操作。