如何使立即调用的Func表达式在构建对象后立即访问javascript中先前定义的属性

如何使立即调用的Func表达式在构建对象后立即访问javascript中先前定义的属性,javascript,iife,Javascript,Iife,预期行为:打印“某个名字” 当前行为:未打印任何内容 我试图在构建对象后立即提供一个内部属性“data”。使用依赖于内部属性“name”的函数检索此“数据”。但是,当调用立即调用的函数表达式时,它似乎无法访问this.name属性,因此我无法在对象构造后立即检索数据 我可以通过首先定义一个等价的this来实现它,比如: var Counter = function(name) { this.name = name; this.data = (function() {

预期行为:打印“某个名字”

当前行为:未打印任何内容

我试图在构建对象后立即提供一个内部属性“data”。使用依赖于内部属性“name”的函数检索此“数据”。但是,当调用立即调用的函数表达式时,它似乎无法访问
this.name
属性,因此我无法在对象构造后立即检索数据

我可以通过首先定义一个等价的
this
来实现它,比如:

 var Counter = function(name) {
    this.name = name;
    this.data = (function() {
        console.log(this.name);
    })();
};

var counter = new Counter("some name");
为什么会发生这种情况?我如何才能使它以优雅的方式工作?

。内部函数中的
this
是全局对象(
window
,如果在浏览器中运行它),而不是构造函数中的
this
对象

根据所针对的JavaScript版本,有几种不同的解决方案:

ECMAScript 5 您可以使用以下方法传递
值:

var计数器=函数(名称){
this.name=名称;
this.data=(函数(){
console.log(this.name);
}).适用(本条);
};
var计数器=新计数器(“某些名称”)。内部函数中的
this
是全局对象(
window
,如果在浏览器中运行它),而不是构造函数中的
this
对象

根据所针对的JavaScript版本,有几种不同的解决方案:

ECMAScript 5 您可以使用以下方法传递
值:

var计数器=函数(名称){
this.name=名称;
this.data=(函数(){
console.log(this.name);
}).适用(本条);
};

var计数器=新计数器(“某些名称”)示例中的问题是上下文。当使用
(function(){})(
时,您将使用一个新的上下文,该上下文的
this.name
属性不同于
Counter
function name属性

您可以使用arrow函数在IIFE函数中使用上下文


警告:我的解决方案需要
ECMA2015
aka
es6
支持。没有es6的另一个解决方案是使用@Peter Olson answer

您可以看到arrow函数的兼容性表

const Counter=函数(名称){
this.name=名称;
this.data=(()=>{
console.log(this.name);
})();
};

常量计数器=新计数器(“某些名称”)示例中的问题是上下文。当使用
(function(){})(
时,您将使用一个新的上下文,该上下文的
this.name
属性不同于
Counter
function name属性

您可以使用arrow函数在IIFE函数中使用上下文


警告:我的解决方案需要
ECMA2015
aka
es6
支持。没有es6的另一个解决方案是使用@Peter Olson answer

您可以看到arrow函数的兼容性表

const Counter=函数(名称){
this.name=名称;
this.data=(()=>{
console.log(this.name);
})();
};

常量计数器=新计数器(“某些名称”)上面有一些很好的信息。我也很好奇,您是否可以分配
这个.data
,然后立即调用您的函数

var计数器=函数(名称){
this.name=名称;
this.data=this.name;
console.log(this.data);
};

var计数器=新计数器(“某些名称”)上面有一些很好的信息。我也很好奇,您是否可以分配
这个.data
,然后立即调用您的函数

var计数器=函数(名称){
this.name=名称;
this.data=this.name;
console.log(this.data);
};

var计数器=新计数器(“某些名称”)
您的自执行函数没有
return
语句。为什么不直接使用
name
或将
name
作为参数传递给函数呢?根据Stoyan Stefanov在“Javascript模式”第43页中的说法,“this”是隐式创建和返回的。无论哪种方式,当我让它返回“this”时都没有什么区别。你的自动执行函数没有
return
语句。你为什么不直接使用
name
或将
name
作为参数传递给函数呢?根据Stoyan Stefanov在“Javascript模式”第43页中的说法,“this”创建并隐式返回。无论哪种方式,当我让它返回“this”时都没有什么区别。我正要问,是否有办法不使用es6功能,因为我使用的是不支持它的Google Apps脚本。谢谢。我正要问,是否有办法不使用es6功能,因为我使用的是谷歌应用程序脚本,而谷歌应用程序脚本不支持es6功能。谢谢。谢谢,“应用”和“那”两种方法都有效!但是我想用一些我不懂的晦涩的东西。使用一些简单的变量而不是“this.name”可以使它工作。为什么“this.name”方法不起作用?@mclzc正如我在回答中提到的,
this
在内部函数中的含义与在外部函数中的含义不同。这就是为什么您需要使用
apply
传递此值,或者将其保存在另一个变量中,如
That
。谢谢,“apply”和“That”方法都有效!但是我想用一些我不懂的晦涩的东西。使用一些简单的变量而不是“this.name”可以使它工作。为什么“this.name”方法不起作用?@mclzc正如我在回答中提到的,
this
在内部函数中的含义与在外部函数中的含义不同。这就是为什么您需要使用
apply
传递该值,或者将其保存在另一个变量中,如
That
var Counter = function(name) {
    var that = {};
    that.name = name;
    that.data = (function() {
        console.log(that.name);
    })();
    return that;
};

var counter = new Counter("some name");