了解Javascript中被称为方法和构造函数的函数的私有性和范围 请考虑以下代码: function Outer(){ function Inner(){ var private="something"; this.method = function(){ //some code here }; } var inner = new Inner(); //Why does this line not throw an error? alert(inner.private); // not accessible here inner.method();//no errors here }
我无法理解为什么method()调用不抛出错误,而变量引用抛出错误?我知道变量的作用域仅在声明它们的函数中?但是函数的范围呢?它并不复杂,也与数据类型无关了解Javascript中被称为方法和构造函数的函数的私有性和范围 请考虑以下代码: function Outer(){ function Inner(){ var private="something"; this.method = function(){ //some code here }; } var inner = new Inner(); //Why does this line not throw an error? alert(inner.private); // not accessible here inner.method();//no errors here },javascript,closures,Javascript,Closures,我无法理解为什么method()调用不抛出错误,而变量引用抛出错误?我知道变量的作用域仅在声明它们的函数中?但是函数的范围呢?它并不复杂,也与数据类型无关 new internal()创建一个新对象。您正在构造函数中为该对象指定属性 this.method = function(){...}; 另一方面,没有这样的属性private。你永远不会这样做this.private=private只是内部函数的局部变量 下面是另一个与您的代码等效的示例,希望能让它更清楚: function creat
new internal()
创建一个新对象。您正在构造函数中为该对象指定属性
this.method = function(){...};
另一方面,没有这样的属性private
。你永远不会这样做this.private=代码>private
只是内部
函数的局部变量
下面是另一个与您的代码等效的示例,希望能让它更清楚:
function createObject() {
var someVariable = '42';
var obj = {};
obj.foo = 'bar';
return obj;
}
var myObject = createObject();
// works, since we assigned the property to the object
console.log(myObject.foo);
// does not work, we never assigned such a property to the object
console.log(myObject.someVariable);
在createObject
内部声明了两个变量,someVariable
和obj
obj
是一个对象,我们为它指定一个属性并从函数返回它someVariable
与对象无关,但可用于函数中的其他用途。它并不复杂,也与数据类型无关
new internal()
创建一个新对象。您正在构造函数中为该对象指定属性
this.method = function(){...};
另一方面,没有这样的属性private
。你永远不会这样做this.private=代码>private
只是内部
函数的局部变量
下面是另一个与您的代码等效的示例,希望能让它更清楚:
function createObject() {
var someVariable = '42';
var obj = {};
obj.foo = 'bar';
return obj;
}
var myObject = createObject();
// works, since we assigned the property to the object
console.log(myObject.foo);
// does not work, we never assigned such a property to the object
console.log(myObject.someVariable);
在createObject
内部声明了两个变量,someVariable
和obj
obj
是一个对象,我们为它指定一个属性并从函数返回它someVariable
与对象无关,但可用于函数内的其他用途。行var-inner=new-inner()会引发错误,因为未定义inner,它只能在外部函数体中访问
无法将inner.private作为inner的属性进行访问,因为它是。因此(新内部()).private不存在。(private在JS中似乎是一个关键字,所以我在示例代码中将它改为priv)
它可以在内部函数体中访问,因为函数体中的代码保留对闭包变量的引用
function Inner(){
var priv="something";
this.method = function(){//wrong, should declare as prototype
console.log("private from within Inner function body:"
,priv)
};
}
var inner = new Inner();
console.log(inner.priv); //=undefined
inner.method();//=something
具有多个实例的对象的函数属性;like INTERNAL可以有许多实例,如:var a=new Inner();var b=新的内部()。。。不应使用此定义。您应该使用原型
使用prototype时,不能在prototype函数中使用私有变量,因为私有(闭包)变量只能在主函数体中访问。这就是为什么许多开发人员使用\u private
或private\u
来表示它是私有的,因为JavaScript没有一种好的方法可以在不破坏原型的情况下将成员私有化
function Inner(){
var priv="private";//wrong
this._priv="private"
}
Inner.prototype.method=function(){
//cannot access priv
console.log(this._priv);//no problem
}
也许有一种情况,你可以用这种方式使用privates,那就是当你的对象只有一个实例时
var Mediator=(function(){
var events={};//private, other code can't mess this up
return{
addEvent:function(eventName){
events[eventName]=(events[eventName])?
events[eventName]:[];
},
addLisener:function(eventName,func){
events[eventName].push(func);
return events[eventName].length-1;
}
//more stuff like removeListener, trigger ...
}
})()
您可以阅读有关原型的信息。您可以使用firebug控制台在Chrome或Firefox中运行代码。按F12将其打开,并将该链接中的代码粘贴到控制台中。然后随心所欲地摆弄它,看看是否得到了预期的输出并理解了JS中的原型设计。行var inner=new inner()会抛出一个错误,因为inner没有定义,它只能在外部函数体中访问
无法将inner.private作为inner的属性进行访问,因为它是。因此(新内部()).private不存在。(private在JS中似乎是一个关键字,所以我在示例代码中将它改为priv)
它可以在内部函数体中访问,因为函数体中的代码保留对闭包变量的引用
function Inner(){
var priv="something";
this.method = function(){//wrong, should declare as prototype
console.log("private from within Inner function body:"
,priv)
};
}
var inner = new Inner();
console.log(inner.priv); //=undefined
inner.method();//=something
具有多个实例的对象的函数属性;like INTERNAL可以有许多实例,如:var a=new Inner();var b=新的内部()。。。不应使用此定义。您应该使用原型
使用prototype时,不能在prototype函数中使用私有变量,因为私有(闭包)变量只能在主函数体中访问。这就是为什么许多开发人员使用\u private
或private\u
来表示它是私有的,因为JavaScript没有一种好的方法可以在不破坏原型的情况下将成员私有化
function Inner(){
var priv="private";//wrong
this._priv="private"
}
Inner.prototype.method=function(){
//cannot access priv
console.log(this._priv);//no problem
}
也许有一种情况,你可以用这种方式使用privates,那就是当你的对象只有一个实例时
var Mediator=(function(){
var events={};//private, other code can't mess this up
return{
addEvent:function(eventName){
events[eventName]=(events[eventName])?
events[eventName]:[];
},
addLisener:function(eventName,func){
events[eventName].push(func);
return events[eventName].length-1;
}
//more stuff like removeListener, trigger ...
}
})()
您可以阅读有关原型的信息。您可以使用firebug控制台在Chrome或Firefox中运行代码。按F12将其打开,并将该链接中的代码粘贴到控制台中。然后随心所欲地摆弄它,看看你是否得到了预期的输出,是否理解JS中的原型设计。新的内部版本
应该会抛出一个错误。你能创建一个JSFIDLE演示吗?deceze请看编辑。好了,现在你已经解决了范围问题,它完全按照预期工作。@deceze我想通过这个问题了解作为方法和构造函数调用的函数的范围。回答会有帮助。新建内部
会引发错误。你能创建一个JSFIDLE演示吗?deceze请看编辑。好了,现在你已经解决了范围问题,它完全按照预期工作。@deceze我想通过这个问题了解作为方法和构造函数调用的函数的范围。一个答案会有帮助。但是为什么你会用闭包作为私人用途呢?我没有看到GoogleClosure库使用它,许多其他库也没有使用它,因为JS似乎不支持privates。以这种方式使用它将破坏prototype(prototype functi中没有您的私有/闭包可用)