我想如果我们以相反的顺序来解释的话我可以更好地解释这一点。首先,我们定义一些函数:
function _PrivateFunction1() {
//This does work though. I am confused.
_PrivateFunction2();
}
function _PrivateFunction2() {
alert("look! PrivateFunction1");
//this does not work.
alert(this.variable1);
}
这是很正常的事情。唯一奇怪的是它们出现在另一个函数中,但这完全没问题。 JavaScript 有功能范围 https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope#Nested_functions_and_closures,这意味着函数内定义的所有变量都在新作用域中定义。他们不践踏全局命名空间。功能是一流的物体 http://en.wikipedia.org/wiki/First-class_object在 JavaScript 中,这意味着它们可以像其他数据类型一样使用。它们可以嵌套、传递给函数、从函数返回等。
然后我们遇到了一些麻烦:
function _PrivateFunction2() {
alert("look! PrivateFunction1");
//this does not work.
alert(this.variable1);
}
}
JavaScript 中的函数总是执行于某些context https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/this这是由this
关键词。当您直接调用函数时(即像这样:functionName()
)该函数执行的上下文是全局的window
目的。所以,里面_PrivateFunction2
, this.variable1
相当于window.variable1
这可能不是你的意思。
您可能想引用当前实例myobject
这是什么this
指的是外面_PrivateFunction2
。您可以保留对this
通过将对它的引用存储在另一个变量中来在内部作用域中:
var _this = this;
function _PrivateFunction2() {
alert("look! PrivateFunction1");
//this does not work.
alert(_this.variable1);
}
这里有一些微妙的东西你应该注意到。_PrivateFunction2
可以访问其定义的变量词汇范围 https://stackoverflow.com/questions/1047454/what-is-lexical-scope,这就是为什么它可以访问_this
。这在以后很重要。
Next up:
function _PrivateFunction1() {
//This does work though. I am confused.
_PrivateFunction2();
}
我想这对你来说应该是最正常的部分。这里没有什么奇怪的事情发生。只是一个常规函数调用另一个函数。不要对它们嵌套在内部的事实感到困惑myObject
。这改变了它们所处的范围,但没有什么其他改变。
接下来我们定义一些实例变量和方法:
this.variable1 = "tst";
this.function1 = function() {
//Now this function works. A 'this' function to a private function is ok
_PrivateFunction1();
//Here is error one, I cannot seem to call methods within the object
//from.
this.function2();
}
this.function2 = function() {
alert("look! function2!");
}
Here this
确实指的是myObject
,假设——这是一个重要的假设——myObject
被称为与new
运算符,如下所示:
var obj = new myObject();
如果它是这样调用的:
var obj = myObject();
Then this
会指的是window
对象,就像我们之前看到的函数一样。关键要点是this
不是固定的。它由函数的调用方式决定。甚至有办法将其设置为任意对象 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/apply明确地。
的价值this
inside this.function1
也将是当前实例myObject
,因为它很可能会这样使用:
var obj = new myObject();
obj.function1();
Writing object.method()
sets this
to object
inside method
.
那么怎么样this.function1
能够打电话_PrivateFunction1()
?正如我们之前在保存值时看到的那样this
用于嵌套函数内部,_PrivateFunction1()
只是定义在中的另一个对象this.function1
的词法范围,因此它可供其使用,就像_this
是更早的。
这是因为关闭 http://jibbering.com/faq/notes/closures/这些私有变量在很久之后仍然存在myObject
已经回来了。
脚注:因为未能使用new
实例化对象时毫无预兆地破坏事物 https://stackoverflow.com/questions/383402/is-javascript-s-new-keyword-considered-harmful,将要用作构造函数的函数名称大写被认为是一个好习惯。所以myObject
确实应该是MyObject
.