var obj={fn1.function (){console.log(this)},fn2()=>{console.log(this)}} obj.fn1();obj.fn2()
时间: 2023-12-17 14:02:19 浏览: 120
这段代码中有一个语法错误,应该是 var obj={fn1:function (){console.log(this)},fn2:()=>{console.log(this)}}。在执行 obj.fn1() 时,this 指向 obj 对象;而在执行 obj.fn2() 时,this 指向 obj 对象所在的作用域(一般情况下指的是全局对象)。
相关问题
<script> str = "window"; const obj = { str: "object", fn: () => { console.log(this.str); }, fn2: function () { console.log(this.str); return { str: "newObj", fn: () => { console.log(this.str); } } }, }; obj.fn(); obj.fn2(); </script>
这段代码与上一个代码段的区别在于,它在定义变量 str 时没有使用 var、let 或 const 关键字,因此 str 变量被定义在全局作用域中。
在调用 obj.fn() 时,箭头函数的 this 仍然指向全局对象,因此控制台会输出 "window"。
在调用 obj.fn2() 时,普通函数的 this 指向的是调用该函数的对象,也就是 obj 对象。因此,控制台会输出 "object"。此外,fn2 函数返回了一个包含 str 和 fn 两个属性的新对象,其中 fn 是一个箭头函数,它的 this 仍然指向全局对象,因此控制台会输出 "window"。
var num = 100; var obj = { num: 50, fn: function () { console.log(this.num); } } for (var i = 0; i < 10; i++) { setTimeout(function () { console.log(i); }, 0) } new Promise(function (resolve) { resolve() var fn2 = obj.fn; fn2(); }).then(function () { obj.fn() })
这段代码主要涉及了 JavaScript 中的作用域、闭包和异步操作。首先,声明了一个全局变量 num 和一个对象 obj,对象中有一个属性 num 和一个方法 fn,方法中使用了 this 关键字,将会指向调用它的对象。然后使用 for 循环和 setTimeout 方法,将会输出 10 个数字,而不是依次输出 0-9,这是因为 setTimeout 方法是异步的,它会将任务推入事件队列中,等待主线程执行完毕后再执行。在 Promise 中,使用了 resolve 方法来执行异步操作,同时将 obj.fn 赋值给 fn2,并在 then 方法中执行 obj.fn 方法,输出 50。由于 this 关键字是动态绑定的,所以它在 setTimeout 和 Promise 中的执行上下文中都会指向不同的对象,分别是全局对象和 obj 对象。
阅读全文