当以不同方式调用/返回函数时,我发现代码的不同行为。这很令人困惑。因此,为了消除我的疑虑,我将整个代码精简到最少:
让我们考虑一个简单的函数:
function f()
{
//some code
}
var objf = f();
Q1。现在objf
是未定义的。为什么?f()
回报是什么?
function f()
{
//some code
return this;
}
var objf = f();
Q2。f()
回报是什么?全局对象?
当以不同方式调用/返回函数时,我发现代码的不同行为。这很令人困惑。因此,为了消除我的疑虑,我将整个代码精简到最少:
让我们考虑一个简单的函数:
function f()
{
//some code
}
var objf = f();
Q1。现在objf
是未定义的。为什么?f()
回报是什么?
function f()
{
//some code
return this;
}
var objf = f();
Q2。f()
回报是什么?全局对象?
Q1。javascript 中的函数总是返回值。默认值为undefined
,但构造函数除外,其默认返回值为this
。由于在 Q1 示例中未指定返回值,因此解释器返回默认值undefined
.
Q2。 this
是一个 javascript 关键字,由解释器根据应用程序上下文进行更新。在没有从对象调用的函数的情况下,如您的 Q2 示例中,this
将引用全局对象。
当你这样做...
function f()
{
//some code
}
var objf = f();
...一旦没有“return something”语句,您将获得“f”函数的返回值,在这种情况下它是未定义的。
如果你这样做...
function f()
{
//some code
}
var objf = new f();
...您将基于“f”函数原型实例化一个新对象。即使您的“f”函数为空,您的 objf 变量也会收到一个新的对象引用。
而这样做...
function f()
{
//some code
return this;
}
var objf = f();
...在您的情况下,“this”将是全局对象,即浏览器的窗口对象。this 键是对函数绑定的对象的引用,看这个:
someobj = {
f:function(){
return this;
}
}
var objf = someobj.f();
objf === someobj; //==>true!!!
在第一种情况下,objf
确实是未定义的。由于该函数不返回任何内容,因此仅仅发明一些东西并返回它是不明智的。
在第二种情况下,objf
将是Window
对象。