Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.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中理解此函数的内部功能_Javascript - Fatal编程技术网

在Javascript中理解此函数的内部功能

在Javascript中理解此函数的内部功能,javascript,Javascript,我最近开始学习Javascript,同时对代码中的代码进行了一些实验: var k = { ab: "hi", func: function() { console.log("inner1" + this.ab); (function() { console.log("inner2 " + this.ab) }()) } }; k.func(); 这段代码给出了inner1 hi和inner2 un

我最近开始学习Javascript,同时对代码中的代码进行了一些实验:

var k = {
    ab: "hi",
    func: function() {
        console.log("inner1" + this.ab);
        (function() {
            console.log("inner2 " + this.ab)
        }())
    }
};
k.func();
这段代码给出了inner1 hi和inner2 undefined的结果

我不明白为什么它在second console.log中没有定义

调用函数时会绑定此函数,具体取决于调用方式。将其作为值而不是属性调用–表达式而不是object.method–将导致将其设置为全局对象,或在严格模式下未定义

函数对象上有两个方法使用显式指定的this:和调用函数。你可以在这里使用前者

(function() {
    console.log("inner2 " + this.ab);
}.call(this));
调用函数时会绑定此函数的值,具体取决于调用方式。将其作为值而不是属性调用–表达式而不是object.method–将导致将其设置为全局对象,或在严格模式下未定义

函数对象上有两个方法使用显式指定的this:和调用函数。你可以在这里使用前者

(function() {
    console.log("inner2 " + this.ab);
}.call(this));
执行匿名函数将更改实例,以持久化上下文:

var k = {
    ab: "hi",
    func: function() {
        console.log("inner1" + this.ab);
        (function() {
            console.log("inner2 " + this.ab)
        }.bind(this).call())
    }
};
k.func();
执行匿名函数将更改实例,以持久化上下文:

var k = {
    ab: "hi",
    func: function() {
        console.log("inner1" + this.ab);
        (function() {
            console.log("inner2 " + this.ab)
        }.bind(this).call())
    }
};
k.func();

对于在第二个函数中使用此函数,您没有任何参考。相反,您可以使用:

(function() {
    console.log("inner2 " + this.ab)
}.call(this))

对于在第二个函数中使用此函数,您没有任何参考。相反,您可以使用:

(function() {
    console.log("inner2 " + this.ab)
}.call(this))

@minitech和@Issac很好地解释了问题和解决方案。在任何级别获取属性的另一种方法是按对象。在您的代码中,它是:

var k = {
    ab: "hi",
    func: function() {
        console.log("inner1" + this.ab);
        (function() {
            console.log("inner2 " + k.ab)
        }())
    }
};

k.func();

@minitech和@Issac很好地解释了问题和解决方案。在任何级别获取属性的另一种方法是按对象。在您的代码中,它是:

var k = {
    ab: "hi",
    func: function() {
        console.log("inner1" + this.ab);
        (function() {
            console.log("inner2 " + k.ab)
        }())
    }
};

k.func();

在您的示例中,“this”表示基于范围的两种不同的内容。您可以使用此示例代码。也许这会帮助你了解基本知识

var k = {
    ab: "hi",
    func: function() {
        var me = this; // save 'meaning of this' in variable me.
        console.log("inner1" + this.ab);
        (function() {
            console.log("inner2 " + me.ab)
        }())
    }
};
k.func();

在您的示例中,“this”表示基于范围的两种不同的内容。您可以使用此示例代码。也许这会帮助你了解基本知识

var k = {
    ab: "hi",
    func: function() {
        var me = this; // save 'meaning of this' in variable me.
        console.log("inner1" + this.ab);
        (function() {
            console.log("inner2 " + me.ab)
        }())
    }
};
k.func();

内部的功能,称为IIFE,将window作为上下文,但您尚未在..内的window objectfunction中定义ab,被称为IIFE,将window作为上下文,但您没有在window对象中定义ab,不传递任何要调用的内容有点多余;你可以这么做,就这样。如果是为了清晰起见……也许可以将其分配给某个对象。不传递任何东西来调用有点多余;你可以这么做,就这样。如果是为了清晰起见…也许可以把它分配到某个地方。谢谢你的回答,这真的很有帮助。谢谢你的回答,这真的很有帮助。