var hello = {
name: "Vishal",
speak: function(to){
return function (){
console.log(this.name+" says hello "+to);
}();
}
}
我将此函数称为 -
hello.speak("Vinay");
实际输出
says hello to Vinay
预期输出
Vishal says hello to Vinay
我知道hello.name
将解决此问题,但如何使用this
解决此问题,以便使用call
方法或apply
或bind
方法解决此问题
答案 0 :(得分:4)
hello
本身就可以访问。
var hello = {
name: "Vishal",
speak: function(to){
console.log(hello.name + " says hello " + to);
}
}
hello.speak("Vinay");
答案 1 :(得分:4)
您的代码中发生了什么:
你已经用一个对象 hello 绑定了一个函数,后者又返回另一个输出内容的函数。外部函数发言充当内部函数的闭包。 这里javascript的行为有点不同,因为它编译代码的方式。内部函数不会识别此变量,而是选择全局 this.name 。
要解决此问题,您必须执行此操作:
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的函数的副本。然后,您可以传递要与this关键字关联的对象或范围。
示例:
var hello = {
name: "Vishal",
speak: function(to){
return function (){
console.log(this.name+" says hello "+to);
};
}
}
var speakTo = hello.speak("Vinay");
var speakToCall = speakTo.bind(hello); //will give you the desired output.
speakToCall();
现在,这不是bind,call或apply的真实用例。它只是向您展示如何使用bind实现您的功能。
真实用例可以是这样的:
使用案例
When you have multiple objects like:
var a = {
firstname: "rahul",
lastname: "arora",
getFullName: function(){
return this.firstname + ' ' + this.lastname;
}
}
//Another object with same properties but without the function
var b = {
firstname: "Micheal",
lastname: "Angelo",
}
//Rather than defining that function again in the object 'b' you can use bind, call or apply to get the desired output.
console.log(a.getFullName.call(b)); // will output Micheal Angelo which is associated to b
我希望它有所帮助。
答案 2 :(得分:0)
执行hello.speak
后,this
将成为hello
对象。因此this.name已经Vishal
。
var hello = {
name: "Vishal",
speak: function(to){console.log(this.name + " says hello " + to)}
}
}
hello.speak("Vinay");
如果你真的想按照问题的方式去做,你可以这样做:
var hello = {
name: "Vishal",
speak: function(to){
var self = this;
return function(self){
console.log(self.name + " says hello to " + to);
}(self);
}
}
您也可以跳过self
,因为lexical
作用域允许您访问该内容。
但请说明您正在做什么。您的Object hello
有name
和speak
方法。当您通过speak
魔术变量以hello
方式调用hello.speak
时,this
已有权访问function
。所以无论你想做什么都可以在那里完成。
你再次创建一个hello.name
,其职责是只访问speak
和作为参数提供的变量,这可以由a = function(){(function(){console.log("Hi")})()}
完成,但它只是一个开销。
对我来说有点像:
a=function(){console.log("Hi")}
当
var hello = {
name: "Vishal",
speak: function(to){
return function (){
console.log(hello.name+" says hello "+to);
}();
}
}
就足够了。
尽可能使代码简单,精确且重点突出。复杂的代码并不是更好,但实际上却相反。我不知道你在做什么,但这是一般原则。
答案 3 :(得分:0)
因为在这种情况下变量'name'是常量我认为你可以使用直接方法并执行:
var hello = {
name: "Vishal",
speak: function(to){
console.log(this.name+" says hello "+to);
}
}
或者您可以放弃返回功能并使用'this'
直接执行 Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
if (e instanceof ExceptionInInitializerError) {
// do something with you're exception
// and than close application
System.exit(-1); // passing
}
}
});
希望它满足你的答案