Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解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 - Fatal编程技术网

了解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中被称为方法和构造函数的函数的私有性和范围 请考虑以下代码: 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

我无法理解为什么method()调用不抛出错误,而变量引用抛出错误?我知道变量的作用域仅在声明它们的函数中?但是函数的范围呢?

它并不复杂,也与数据类型无关

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中没有您的私有/闭包可用)