如何在此代码中访问名称

时间:2016-07-03 13:30:48

标签: javascript

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方法或applybind方法解决此问题

4 个答案:

答案 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 hellonamespeak方法。当您通过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 
            }
        }
    });

希望它满足你的答案