3

我最近一直在测试一些代码,试图更好地理解 javascript。然后我遇到了call()我无法很好理解的功能。

我有以下代码:

function hi(){
    console.log("hi");
}

var bye = function(param, param2){
    console.log(param);
    console.log(param2);
    console.log("bye");
}

如果我打电话bye.call(hi(), 1, 2),我会得到hi 1 2 undefined

如果我打电话bye.cal(1,2),我会得到2 undefined bye undefined

我理解call()函数的第一个参数必须是一个函数,然后是我的bye函数接受的参数量。但是最后一个未定义的来自哪里?

4

4 回答 4

4

第一个参数不必是函数。第一个参数是在函数调用的上下文中设置“this”变量的对象。

var bye = function(param, param2){
    console.log(param);
    console.log(param2);
    console.log("bye");
    console.log(this.x)
}

t = {'x': 1};

bye.call(t, 1, 2);

控制台应显示:1、2、“再见”和 1。

undefined 是函数的返回值。

在您的第一次通话中:

bye.call(hi(), 1, 2)

你正在调用 hi() (所以它打印 'hi'),没有使用返回值,并且 1 和 2 是要再见的参数。

在您的第二次通话中:

bye.cal(1,2)

1 分配给这个。2 是参数,而 param2 是未定义的。

于 2013-06-10T05:08:11.343 回答
2

你得到了 undefined 因为你的函数没有返回任何东西,它只将输出打印到屏幕上。所以,你的代码可能是这样的:

var obj = {foo: "hi"};
var bye = function(param, param2){
    console.log(this.foo);
    console.log(param);
    console.log(param2);
}

bye.call(obj, 1, 2)   // "hi", 1, 2

您可以在 MDN上阅读此处了解更多信息.call()

于 2013-06-10T05:06:28.043 回答
1

fn.call()允许您设置this调用函数时将具有的值。的值this必须是 的第一个参数fn.call()

于 2013-06-10T05:09:44.730 回答
0

call 方法需要所有参数单独应用方法需要数组中的所有参数,并通过示例进行说明。

let solarSystem = {
    sun: 'red',
    moon : 'white',
    sunmoon : function(){
       let dayNight = this.sun + ' is the sun color and present in day and '+this.moon + ' is the moon color and prenet in night';
        return dayNight;
    }
}

let work = function(work,sleep){
    console.log(this.sunmoon()); 
    // accessing the solatSystem it show error undefine sunmmon untill now because we can't access directly for that we use .bind(),.call(),.apply()
    console.log('i work in '+ work +' and sleep in '+sleep);
}

let outPut = work.call(solarSystem,'day','night');
let outPut1 = work.call(solarSystem,['day1','night1']);
let outPut2 = work.apply(solarSystem,['day2','night2']);

于 2020-12-03T12:43:59.317 回答