我有这样的代码片段:
/** @constructor */
Person = function() {
// member method
this.say = function() {
return "I'm an instance.";
}
// inner function
function say() {
return "I'm inner.";
}
}
// static method
Person.say = function() {
return "I'm static.";
}
var p = new Person();
p.say(); //=> I'm an instance.
Person.say(); //=> I'm static.
// there is no way to directly access the inner function from here
我知道了
function say() { ... }
等同于
var say;
say = function() { ... }
等同于
var say;
this.say = function() { ... }
那么,为什么内部函数没有覆盖成员方法呢?
-----编辑-----
我仍然感到困惑,是this
保存所有局部变量的对象吗?让我们在这里再举一些例子。
// Tested both in node.js and Chrome 34
var t = "stackoverflow";
console.log(t); //=> stackoverflow
console.log(this.t); //=> stackoverflow
因此,这意味着,当我声明局部变量时,可以通过this
关键字访问它。
// Tested both in node.js and Chrome 34
this.t = "stackoverflow";
console.log(t); //=> stackoverflow
console.log(this.t); //=> stackoverflow
这意味着,当我向分配属性时this
,可以通过本地范围访问它。这很混乱!就像wrappers
函数有两个一样,一个是上下文this
,另一个是作用域吗?
因此,现在我对这种机制的理解是:
tmp
。然后,如果我通过访问它this
,JSVM将首先查找this
以查看是否this.tmp
存在。如果没有,它将寻找tmp
。如果没有找到,我得到undefined
。this
,让我们命名它this.tmp
。然后,如果我通过简单的编写来访问它tmp
,那么JSVM将首先查找范围以查看是否tmp
存在。如果没有,它将查看是否this.tmp
存在。如果没有找到,我得到undefined
。我对吗?
你说错了
var say;
say = function () { ... }
等同于
var say;
this.say = function () { ... }
并了解您为什么需要了解this
关键字。此关键字保存对使用它的函数所属的对象的引用。在构造函数内部时,您要引用正在构造的对象,因此可以使用this
。在这种情况下,当您将某些内容放入this
构造函数将生成的对象中时。
从这种意义上讲,第二段代码将为您提供一个具有一个say
恰好是函数的属性的对象。
当您在javascript中使用构造函数时,该对象唯一公开的内容是使用this
关键字赋予该对象的属性。另一方面,内部函数是在构造函数范围内的函数,可以在其中使用,但由于您不希望在内部构造函数中不公开,因此内部函数不公开。
将其与生成对象文字的以下函数进行比较:
function buildMyObject() {
function doSomething (obj) { ... }
var objToBuild = { };
doSomething(objToBuild);
return objToBuild;
}
在这种情况下,为方便起见,您可以定义一个函数来对对象执行某些操作,然后在构建对象的函数内部使用它。返回了该对象,但是看到完成该功能的函数被隐藏了,因为它只是在的范围之内buildMyObject
。这类似于您在构造函数中使用函数的情况:它们提供在构造函数内部可能有用的实用程序,但是由于作用域,它们在外部世界中是隐藏的。
编辑:该this
关键字可以是简要地描述如下:当您使用它在函数内部,this
保持向函数所属的对象的引用。换句话说,该this
功能持有对当前实例的引用,即持有该功能的那个实例。
现在你的第一个例子
// Tested both in node.js and Chrome 34
this.t = "stackoverflow";
console.log(t); //=> stackoverflow
console.log(this.t); //=> stackoverflow
为什么会这样?好吧,因为在这种情况下,该函数所属的对象就是simple window
。在这种情况下,t
和this.t
都是相同的,因为它们this
持有对window
对象的引用。
尽管在使用时必须注意作用域,this
因为它取决于作用域,但是此关键字只是将对拥有该功能的对象的引用保留为该引用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句