首页 > 试题广场 >

请阅读以下代码 var obj = {}...

[单选题]
请阅读以下代码
var obj = {};
obj.log = console.log;
obj.log.call(console,this);
该代码在浏览器中执行,输出的日志结果是什么?
  • undefined
  • window
  • console
  • obj
正确答案是B。
这道题看似在考this的绑定问题,实际上是通过this绑定为幌子,考察非严格模式下JavaScript语句中“this”默认指向全局对象(window)。
题目的关键点在第3行,我们知道,this绑定的优先级是new>bind>call(apply)>obj.func()>默认绑定。也就是说obj.log.call(console, this)语句中,实际上log函数内的this实际上指代的是console(这也是本题最大的陷阱!)。然而实际上这一语句中obj.log.call(console, this)这一语句中打印的this是在外部传进去的,和函数内的this对象根本没有关系!也就是说此时log函数内的this指代console,但是打印的是从外面传进去的this对象,也就是window!
为了证明这一点,读者朋友们可以把obj.log.call(console, this)中的console改成任意一个对象,然后在非严格模式下执行,会发现结果都是window。
编辑于 2020-01-04 17:26:12 回复(3)
obj.log = console.log;//在本行中obj对象中创建了一个函数(即console.log)的引用log,因为是个这个函数的引用如果想要执行可以有两种方法,第一种是后边加(),第二种是使用apply()或者call(),二者第一个参数都是this,接下来的参数apply是参数数组或者是"arguments",而call的参数是直接的参数值
obj.log.call(console,this);//如上所述,call的第二个参数是要被传入obj.log()的参数,这行代码其实可等价于console.log(this),而因为这三行代码都是在global环境下定义的(不是函数中的局部变量),所以this就是window.
至于第一个参数为什么是console而不是this,我觉得console被按照this处理了,我试了试,替换后的执行结果相同
发表于 2019-09-24 04:24:54 回复(0)
call方法是用来改变this指向的,调用该方法的obj方法log中的this不再指向obj。没用明确指向的this都指向顶层对象window
发表于 2019-09-30 15:30:40 回复(0)
考察点:this的指向
为了更加明确问题,我们将代码重写一下
var obj = {};
// 这里重写log函数,让它打印出this的指向和传入的内容
function mylog(str){
    console.log(this, str);
}
obj.log = mylog;
obj.log.call(console, this) // console, window
这样写,就可以清晰的看出来,打印的第一个,是通过call将mylog函数的this指向了console
而打印的第二个,则只是mylog函数的传参而已,这时的this指向是谁调用指向谁,最后一句写全是window.obj.log.call,所以this指向window
发表于 2020-11-24 20:36:06 回复(0)
var obj = {};
obj.log = console.log;
obj.log.call(console,this);
代码解析:
obj属性log指向console的log函数
众所周知console的log函数接收一个参数用于打印
第三句代码call使得obj.log函数里的this指向了console,第二个参数作为log函数的参数,所以实际上打印的是call传进去的第二个参数,传啥打印啥
obj.log.call(console,this);等价于obj.log(this);因为call改的this根本没有用到
编辑于 2021-06-01 16:51:08 回复(0)
obj.log和console.log指向同一个函数, 使用obj.log.call(console)其实就是调用console.log()。 console.log(message)接受参数message并打印 obj.log.call(console, this)与console.log(this)相同,而在全局作用域下这个this为window!
发表于 2020-04-16 09:45:34 回复(0)
全局执行环境中this 都指向全局对象
函数内部this的值取决于函数被调用的方式。
let obj = {}
// example1
function fn(e){
    console.log('传参',e)    // 传参 window{}
    console.log('内部',this) // 内部 {}
}
fn.call(obj, this)

// example2
let o = {
    foo:function(){
        function fn(e){
            console.log('传参',e)    // 传参 {foo: ƒ}
            console.log('内部',this) // 内部 {}
        }
        fn.call(obj,this)
    }
}
o.foo()
fn(e){}
1、this作为参数传入fn执行时取决于当前执行函数的执行上下文
2、fn函数内部的this才受call绑定影响。
编辑于 2020-03-10 20:48:17 回复(0)
Object [global] { global: [Circular], clearInterval: [Function: clearInterval], clearTimeout: [Function: clearTimeout], setInterval: [Function: setInterval], setTimeout: [Function: setTimeout] { [Symbol(nodejs.util.promisify.custom)]: [Function] }, queueMicrotask: [Function: queueMicrotask], clearImmediate: [Function: clearImmediate], setImmediate: [Function: setImmediate] { [Symbol(nodejs.util.promisify.custom)]: [Function] }, obj: { log: [Function: bound consoleCall] } } 请问这是啥
发表于 2022-03-17 12:15:21 回复(0)
全局作用域下  非严格指向window  严格undefined
发表于 2020-12-24 16:44:27 回复(0)

因为call方法的特性 Function.prototype.call() - JavaScript | MDN (mozilla.org)

这里最后一行代码可以直接看作

console.log(this)

this是从外面传入的

即 window

发表于 2022-04-30 10:56:31 回复(0)
默认是非严格模式啊,我还以为是严格模式呢,选了undefined
发表于 2023-09-04 12:42:10 回复(0)
m
发表于 2023-03-26 23:22:07 回复(0)

obj.log是一个函数:console.log(),这个函数在调用的时候,需要传一个参数进去

console是一个对象

obj.log.call(console,this),log函数中不是要console.log(this),而是要console.log(参数),这个参数是call时传入的this;this向全局查找为window

发表于 2023-02-21 18:54:41 回复(0)
参数的第一个console是什么意思啊?
发表于 2022-10-05 22:29:58 回复(0)
打印函数在global环境定义,所以this指向window
发表于 2022-07-17 00:09:35 回复(0)
var obj = {};
var a = 1;
obj.log = console.log;
obj.log.call(this,console);//console
obj.log.call(console,this);//window
obj.log.call(document,this);//window
obj.log.call(a,this);//window
console.log(this.console)//console
console.log(console.this)//undefined
试了下,不太明白
发表于 2022-05-17 21:53:46 回复(1)
call函数将obj.log这个方法的this改成了console的this,而console是window的对象,它的this指向的就是window。this作为参数传递给obj.log,因为obj.log中的this指向window,所以输出window
发表于 2022-03-08 15:00:43 回复(0)
蒂花之秀
发表于 2021-12-24 03:07:01 回复(0)
注意 call 方法的第二个参数指的是传给调用 call 的这个函数的参数。

obj.log.call(console,this); 这个 this 只是一个参数, 只是 log 这个函数的调用对象从 obj 对象变回了 console 函数,相当于执行 console.log(this) 。然后浏览器里全局作用域下 this 指向 window。


发表于 2021-11-08 09:58:34 回复(0)
首先,console.log是一个函数,其次call()方法的第一个参数是this指向,第二个参数是函数的参数值。
发表于 2021-09-15 16:14:42 回复(0)