如何使立即调用的Func表达式在构建对象后立即访问javascript中先前定义的属性
预期行为:打印“某个名字” 当前行为:未打印任何内容 我试图在构建对象后立即提供一个内部属性“data”。使用依赖于内部属性“name”的函数检索此“数据”。但是,当调用立即调用的函数表达式时,它似乎无法访问如何使立即调用的Func表达式在构建对象后立即访问javascript中先前定义的属性,javascript,iife,Javascript,Iife,预期行为:打印“某个名字” 当前行为:未打印任何内容 我试图在构建对象后立即提供一个内部属性“data”。使用依赖于内部属性“name”的函数检索此“数据”。但是,当调用立即调用的函数表达式时,它似乎无法访问this.name属性,因此我无法在对象构造后立即检索数据 我可以通过首先定义一个等价的this来实现它,比如: var Counter = function(name) { this.name = name; this.data = (function() {
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
akaes6
支持。没有es6的另一个解决方案是使用@Peter Olson answer
您可以看到arrow函数的兼容性表
const Counter=函数(名称){
this.name=名称;
this.data=(()=>{
console.log(this.name);
})();
};
常量计数器=新计数器(“某些名称”)代码>示例中的问题是上下文。当使用(function(){})(
时,您将使用一个新的上下文,该上下文的this.name
属性不同于Counter
function name属性
您可以使用arrow函数在IIFE函数中使用上下文
警告:我的解决方案需要ECMA2015
akaes6
支持。没有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");