我有这样的代码片段:
/** @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() { ... }那么,为什么内部函数没有覆盖成员方法?
-----EDIT-----
我仍然感到困惑,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。我说的对吗?
发布于 2014-04-22 11:07:31
你说这话的时候有个错误
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为什么会发生这种事?因为在这种情况下,函数所属的对象就是window。在这种情况下,t和this.t都是相同的,因为this持有对window对象的引用。
虽然您在使用this时必须知道作用域,因为它与作用域有关,但这个关键字只保存对拥有使用它的函数的对象的引用。
发布于 2014-04-22 11:04:01
this.say和Person.say分配对象的属性。内部函数是函数作用域中的局部变量,而不是对象的属性。
https://stackoverflow.com/questions/23217542
复制相似问题