Javascript 如何使名称在此代码中可访问

Javascript 如何使名称在此代码中可访问,javascript,Javascript,我把这个函数称为- var hello = { name: "Vishal", speak: function(to){ return function (){ console.log(this.name+" says hello "+to); }(); } } 实际产量为 向维尼问好 预期产量为 维沙向维奈问好 我知道hello.name将解决此问题,但如何使用此方法解决此问题,以便使用call方法或appl

我把这个函数称为-

var hello = {
    name: "Vishal",
    speak: function(to){ 
        return function (){ 
            console.log(this.name+" says hello "+to);
        }();
    }
}
实际产量为

向维尼问好

预期产量为

维沙向维奈问好


我知道hello.name将解决此问题,但如何使用此方法解决此问题,以便使用call方法或apply或bind方法解决此问题。

hello可以在其内部访问

var hello={ 姓名:Vishal, 发言:对{ console.loghello.name+向用户打招呼; } } 你好,斯派克维尼 hello本身是可访问的

var hello={ 姓名:Vishal, 发言:对{ console.loghello.name+向用户打招呼; } } 你好,斯派克维尼 当您执行hello.speak时,this将成为hello对象。因此,这个名字已经是Vishal了

如果你真的想按照你在问题中提出的方式来做,你可以这样做:

var hello = {
    name: "Vishal",
    speak: function(to){console.log(this.name + " says hello " + to)}
    }
}


hello.speak("Vinay");
你也可以跳过传递self,因为词法范围允许你访问self

但是想象一下你在做什么。您有一个对象hello,它有一个名称和一个speak方法。当您通过this magic变量将其作为hello.speak调用时,speak已经可以访问hello。所以无论你想做什么都可以在那里做

您再次创建了一个函数,其职责是只访问hello.name和作为参数提供的变量,speak已经可以完成这项工作,但这只是一项开销

对我来说,这有点像:

var hello = {
    name: "Vishal",
    speak: function(to){ 
        var self = this;
        return function(self){
            console.log(self.name + " says hello to " + to);
        }(self);
    }   
}
什么时候

就够了

尽可能使代码简单、精确、切中要害。复杂的代码不是更好,但实际上恰恰相反。再一次,我不确定你在做什么,但是这是一个一般原则。

当你做hello.speak时,this将成为hello对象。因此,这个名字已经是Vishal了

如果你真的想按照你在问题中提出的方式来做,你可以这样做:

var hello = {
    name: "Vishal",
    speak: function(to){console.log(this.name + " says hello " + to)}
    }
}


hello.speak("Vinay");
你也可以跳过传递self,因为词法范围允许你访问self

但是想象一下你在做什么。您有一个对象hello,它有一个名称和一个speak方法。当您通过this magic变量将其作为hello.speak调用时,speak已经可以访问hello。所以无论你想做什么都可以在那里做

您再次创建了一个函数,其职责是只访问hello.name和作为参数提供的变量,speak已经可以完成这项工作,但这只是一项开销

对我来说,这有点像:

var hello = {
    name: "Vishal",
    speak: function(to){ 
        var self = this;
        return function(self){
            console.log(self.name + " says hello to " + to);
        }(self);
    }   
}
什么时候

就够了


尽可能使代码简单、精确、切中要害。复杂的代码不是更好,但实际上恰恰相反。同样,我不确定您在做什么,但这是一个一般原则。

因为在这种情况下变量“name”是常量,我认为您可以使用直接方法,并执行以下操作:

a=function(){console.log("Hi")}
或者,您也可以放弃返回函数,直接使用“this”执行此操作

var hello = {
name: "Vishal",
speak: function(to){ 
    return function (){ 
        console.log(hello.name+" says hello "+to);
        }();
    }
}

希望它能满足您的回答

因为在这种情况下变量“name”是常量,我认为您可以使用直接方法并执行以下操作:

a=function(){console.log("Hi")}
或者,您也可以放弃返回函数,直接使用“this”执行此操作

var hello = {
name: "Vishal",
speak: function(to){ 
    return function (){ 
        console.log(hello.name+" says hello "+to);
        }();
    }
}
希望它满足您的回答

您的代码中发生了什么:

您已将一个函数绑定到一个对象hello,该对象反过来返回另一个输出某些内容的函数。外部函数speak充当内部函数的闭包。 这里javascript的行为有点不同,因为它编译代码的方式不同。内部函数不会识别this变量,而是选择全局this.name

要解决此问题,您必须执行以下操作:

var hello = {
name: "Vishal",
speak: function(to){ 
       console.log(this.name+" says hello "+to); 
    }
}
理解用例绑定

绑定:

创建调用绑定的函数的副本。然后,您可以传递要和this关键字关联的对象或范围

例如:

var hello = {
    name: "Vishal",
    speak: function(to){ 

   //we tell this closure that this is to be taken from function scope and no the global scope
       var self = this; 
        return function (){ 
            console.log(self.name+" says hello "+to);
        }();
    }
}

hello.speak("Vinay");
现在,这不是bind、call或apply的实际用例。它只是向您展示如何使用bind实现您的功能

真正的用例可以是这样的:

用例:

我希望它能有所帮助。

您的代码中发生了什么:

您已将一个函数绑定到一个对象hello,该对象反过来返回另一个输出某些内容的函数。外部函数speak充当内部函数的闭包。 这里javascript的行为有点不同,因为它编译代码的方式不同。内部函数不会识别this变量,而是选择全局this.name

要解决此问题,您必须执行以下操作:

var hello = {
name: "Vishal",
speak: function(to){ 
       console.log(this.name+" says hello "+to); 
    }
}
理解用例绑定

绑定:

创建调用绑定的函数的副本。然后,您可以传递要和this关键字关联的对象或范围

例如:

var hello = {
    name: "Vishal",
    speak: function(to){ 

   //we tell this closure that this is to be taken from function scope and no the global scope
       var self = this; 
        return function (){ 
            console.log(self.name+" says hello "+to);
        }();
    }
}

hello.speak("Vinay");
现在,这不是bind、call或apply的实际用例。它只是向您展示如何使用bind实现您的功能

真正的用例可以是这样的:

用例:


我希望有帮助。

为什么要返回另一个函数的结果,而不是

直接在speak中调用console.log?在那种情况下它会起作用。问题是,用不同的上下文调用内部函数。@ USER 366112使用Helo.No.InSistaDI只想理解调用的使用,这是我的要求,而不是控制台。日志可以考虑另一个返回。您可以使用}。而不是};调用IIFE,但我不确定为什么要开始IIFE。我知道hello.name将解决此问题,但如何使用此方法解决此问题,以便使用call方法或apply或bind方法解决此问题。为什么要返回另一个函数的结果,而不是直接在speak中调用console.log?在那种情况下它会起作用。问题是,用不同的上下文调用内部函数。@ USER 366112使用Helo.No.InSistaDI只想理解调用的使用,这是我的要求,而不是控制台。日志可以考虑另一个返回。您可以使用}。而不是};调用IIFE,但我不确定你为什么要开始IIFE。我知道hello.name会解决这个问题,但如何使用这个方法解决它,以便使用call方法或apply或bind方法解决这个问题。谢谢你的回复,但朋友,我的要求是使用call使其可访问,以某种方式绑定或应用方法,并将此.name保留在那里。但不确定hello本身是否可访问是正确的术语。。。它是可访问的,因为它是全局变量谢谢你的回复,但朋友,我的要求是以某种方式使用call、bind或apply方法使其可访问,并将此.name保留在那里。不确定hello本身是否可访问是正确的术语。。。它是可访问的,因为它是全球可变的。谢谢你的回答,但我有这样的要求。那么你能发布完整的要求吗,对于这个简单的用例,它不是必需的。先生,由于公司限制,有时您无法发布实际需求,但这是一种有点类似的情况。谢谢您的回答,但我有这种需求。那么您可以发布完整的需求吗,对于这个简单的用例,它不是必需的。先生,由于公司的限制,有时您无法发布实际需求,但这是一个有点复杂的场景。Hi@shrikanth感谢您的回答,但是否不可能使用call或bind或apply方法中的某种方式来解决它?或者在理解它的真正用途时有什么严重的错误吗?调用或应用方法用于调用函数我不知道在这种情况下它有什么帮助:/Hi@shrikanth谢谢你的回答,但是不可能使用调用或绑定或应用方法中的某种方式来解决它吗?或者在理解它的真正用途时有什么严重的错误吗?调用或应用方法被用来调用一个函数,我不知道它在这种情况下会有什么帮助:/Thank@Rahul,这是可行的,我理解其中的一点,我将进一步探索以完全理解它。或者:返回函数{…}.bindthis;为了保存消费者的.bind呼叫。谢谢@Rahul您对我理解这件事有很大帮助,我尝试了一些错误的工作,您向我说明了这一点。非常感谢,先生..谢谢@Rahul,这是有效的,我理解其中的一部分将进一步探索以完全理解它。或者:返回函数{…}.bindthis;为了保存消费者的.bind呼叫。谢谢@Rahul您对我理解这件事有很大帮助,我尝试了一些错误的工作,您向我说明了这一点。非常感谢,先生。。