2017-01-02 55 views
0

我目前正在使用模块,但我的困惑是,当我在函数中编写return对象时,它可以调用外部函数范围,但是当我编写像var obj = {some: something}这样的标准对象时,则不能在函数范围外调用。为什么和如何?Javascript模块控件

// Return Object 
 
var ray = (function(){ 
 
    return { 
 
     speak: function(){ 
 
      console.log("Haseeb"); 
 
     } 
 
    }; 
 
})(); 
 
ray.speak(); 
 

 
// Standard Object 
 
var ray = (function(){ 
 
     var obj = { 
 
      speak: function(){ 
 
      console.log("Haseeb"); 
 
     }   
 
    } 
 
})(); 
 

 
obj.speak();

+0

如果你不声明obj里面的函数,那么它将成为窗口对象。 – Mahi

+0

如果我声明ray.obj,该怎么办?类似顶部ray.speak –

+0

因为你没有返回,那么射线将是不确定的。最好从对象声明中删除'var'。 – Mahi

回答

0

假设你的意思是写ray.speak();而不是obj.speak();;

// Standard Object 
var ray = (function(){ 
    var obj = { 
    speak: function(){ 
     console.log("Haseeb"); 
    }   
    } 
})(); 

在这个片段中,当执行匿名函数返回什么ray变量,所以当你尝试从ray访问speak()方法,它抛出一个错误说Cannot read property 'speak' of undefined

但是在您的第一个片段中,匿名函数确实会使用speak方法返回一个对象,因此您可以拨打ray.speak()

+0

是有帮助的我明白 –

0
// Standard Object 
var ray = (function(){ 
     var obj = { 
      speak: function(){ 
      console.log("Haseeb"); 
     }   
    } 
})(); 

obj.speak(); 

由于词法范围的工作原理,这不起作用。外部的Obj没有与函数内部定义的内容相关的上下文,因为obj是在函数的块范围内声明的。但是,如果obj被声明在同一范围内,它将按预期工作。

var obj; 
// Standard Object 
var ray = (function(){ 
     obj = { 
      speak: function(){ 
      console.log("Haseeb"); 
     }   
    } 
})(); 

obj.speak(); 

ray.speak()将不起作用,因为它没有绑定到obj。 return obj={...}将成为这个问题的解决方案。

0

了解JavaScript变量范围将有所帮助: http://www.w3schools.com/js/js_scope.asp

现在来到你的代码。 在第一个片段中,变量'ray'被赋值为自执行函数返回的值,这是返回的对象。它类似于此:

var ray = { 
     speak: function(){ 
      console.log("Haseeb"); 
     } 
    }; 

所以现在下面的语句是“雷”的有效有一个属性“说话”

ray.speak(); 

然而,在片段的第二部分,不会返回任何通过自我执行的功能,因此,它类似于:

var ray = undefined; 

现在的声明“ray.speak()”是等同于执行“undefined.speak()”,这将抛出一个错误,很明显。

此外,执行obj.speak与执行'undefined.speak()'相同,因为变量'obj'仅在该自执行功能内可用。在函数之外,'obj'没有被定义。

希望这会有所帮助。:)

编辑:

说明你对return语句的问题:

return语句返回无论是在它前面的代码/语句的输出。

例子:

var a = 2; 
return a; // will return a's value, i.e. '2' 

var obj = { x:1 }; 
return obj; // will return the obj variable's value i.e. { x:1 } 

var a = 1; 
return a > 1; // will return false i.e. what 'a > 1' outputs after execution 

所以,如果你写

return obj = { x:1 }; 

这将返回什么分配 '的obj = {x:1}' 的输出,这是OBJ分配的值。

现在来到你的代码

var ray = (function(){ 
     return obj = { 
      speak: function(){ 
      console.log("Haseeb"); 
     }   
    } 
})(); 

这里return语句不作OBJ提供给函数之外的范围,它只是返回obj的值,然后将其分配给“雷”。 之所以能够做到obj.speak()而没有得到任何异常,是因为您已经使用了变量obj,而没有在函数中使用'var'关键字声明它,导致'obj'在全局范围内自动声明。这就是为什么你可以在函数之外访问'obj'的原因。

如果你改变你的代码如下:

var ray = (function(){ 
    var obj; 
    return obj = { 
      speak: function(){ 
      console.log("Haseeb"); 
     }   
    } 
})(); 

您将获得异常,而试图执行obj.speak()功能之外。因为'obj'现在只在函数内声明并可用。

我建议阅读一些关于JavaScript中变量作用域的教程,并在控制台上播放一下。 :)

希望这会有所帮助:)

+0

多数民众赞成在很大程度上只是帮助我了解:) –

+0

但有一个混淆,当我使用返回obj = {说:功能(){}},因此它可以工作在这样的范围之外ray.speak简单的说就是根据你的说法:function(){ },但是还有一件事情它也可以调用obj.speak,所以你怎么能区分ray.speak或者obj.speak这两个他们说话的对象? –

+0

,在很多情况下,写入返回obj = {}对象我试图检查console.log几件事情不起作用,如 console.log(ray.speak()); console.log(obj.speak()); console.log(ray。OBJ); 这里是我写入的片断 VAR射线=(函数(){ 返回OBJ = { 讲:函数(){ 返回的console.log( “Haseeb”);} } })() ; –