在以下代码中,我无法理解有关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
stk.push
不是函数。为什么?为什么缺少this
会阻止推送方法。new Stack()
,为什么不能let stk= Stack()
来识别函数内部的方法?因为我正在实例化Stack函数,不管方法是否用this
声明, stk var应该能够访问函数,不是吗? / p>
答案 0 :(得分:1)
让我们看两个例子:
push = function() { /*...*/ }
和
var push = function() { /*...*/ }
在第一个push
中是一个全局变量。
因此,我们不会定义Stack.push
push
之类的内容。
所以,你这样做:
push();
它已经执行但当然失败了!
在第二个变量中,变量是本地范围的,这意味着它只能在Stack
函数中使用。
因此,在这种情况下,推送在Stack之外的任何地方都是未定义的。
未定义push
和Stack.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 ,内部函数成为对象的一个方法,可以调用它来执行某些操作。