【问题标题】:Cannot read property of inner function in IIFE?无法在 IIFE 中读取内部函数的属性?
【发布时间】:2017-10-30 05:57:31
【问题描述】:
var ag = (function(){
        function update(at){
            console.log('at::'+at);
        }
        return {hike:function(){update(2);}}
})();

在这种方法中,我可以通过引用(ag.hike();) 访问内部函数远足()。

var ag = (function(){
         function update(at){
            console.log('at::'+at);
         }
         return update(2);
})();

在上面的示例中,即使通过引用(ag.update(2) 或 ag.update()),我也无法访问相同的内部 update() 方法。

我读到我们无法读取 IIFE 的内部属性。但在第一种情况下,我可以访问,而在第二种情况下,我无法访问。

以上两个例子有什么区别? 为什么这两种不同的行为? 请解释一下。对不起我的英语。

【问题讨论】:

  • 在第一个 sn-p 中,您返回一个 objcet,它有一个方法,该方法在 IIFE 上是封闭的。在第二个 sn-p 中没有闭包,IIFE 只返回一个值(实际上是 undefined)。
  • function update(at) 返回 undefined .. 你返回 return update(2); ... 因此ag === undefined
  • 谢谢,但我在某处读过任何内部函数都可以是闭包。所以我们不能通过闭包访问。对不起,如果我错了

标签: javascript iife self-invoking-function


【解决方案1】:

在下面的sn-p中:

var ag = (function(){
   function update(at){
      console.log('at::'+at);
   }
   return { hike: function(){ update(2); } }
})();

您正在返回一个对象,其属性hike 具有其中update 函数的引用。这里hike 是一个函数,因此可以调用。

在第二个sn-p中:

var ag = (function(){
    function update(at){
       console.log('at::'+at);
    }
    return update(2);
})();

您正在返回 update(2) 的结果,由于 update 函数没有返回任何内容,ag 的值是 undefined,这是不可调用的。

您可以尝试返回 update 引用,然后使用 2 调用它。

var ag = (function(){
    function update(at){
       console.log('at::'+at);
    }
    return update;
})();
ag(2) // at::2

【讨论】:

    【解决方案2】:

    使用bind如果你想返回一个函数以便稍后调用at的值绑定到2;

     return update.bind(null, 2);
    

    它返回一个可以这样调用的函数

    ag();// at::2
    

    您的方法的问题在于,在执行return update(2); 时,您会立即调用update 函数并返回update 函数返回的值undefined,因为您没有返回该函数内的任何内容。

    【讨论】:

    • 嗨@RanjithReddyKeesari,如果答案有帮助或有疑问,请告诉我。
    猜你喜欢
    • 2022-10-13
    • 2022-10-07
    • 1970-01-01
    • 2018-06-10
    • 2021-09-30
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 2017-01-16
    相关资源
    最近更新 更多