3、阅读下面的代码,给出其运行结果。 <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>
时间: 2024-02-10 18:12:35 浏览: 103
这段代码的运行结果如下:
首先,执行 `obj.fn();`,会输出 "window",因为箭头函数的 `this` 指向的是定义时的作用域,而此时的作用域为全局作用域,即 `window` 对象。
然后,执行 `obj.fn2();`,会输出 "object",因为普通函数的 `this` 指向的是调用时的对象,即 `obj` 对象。然后,在 `fn2` 函数中,返回一个对象字面量,该对象的 `str` 属性为 "newObj",并且包含一个箭头函数 `fn`,执行 `obj.fn2().fn();` 时,会输出 "object",因为箭头函数的 `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>
该代码会输出以下结果:
window
object
window
解释:
- 在第一行中,声明并初始化了一个全局变量 str,值为字符串 "window"。
- 在第二行中,声明了一个常量 obj,值为一个对象。该对象包含三个属性:str 为字符串 "object",fn 为一个箭头函数,fn2 为一个函数。
- 在第五至八行中,箭头函数 fn 定义了一个 console.log 语句,输出 this.str 的值。由于箭头函数的 this 始终指向其定义时的作用域,而该箭头函数是在全局作用域中定义的,因此 this 指向的是全局对象 window。因此在第九行调用 fn 时,输出 window。
- 在第十至十六行中,函数 fn2 定义了一个 console.log 语句,输出 this.str 的值,并返回一个新对象。新对象包含一个 str 属性,值为字符串 "newObj",以及一个箭头函数 fn,该箭头函数也定义了一个 console.log 语句,输出 this.str 的值。在函数 fn2 中,this 指向的是调用该函数的对象 obj。因此在第九行调用 fn2 时,输出 object。在第十行调用 fn2 返回的对象的 fn 方法时,输出 window。这是因为箭头函数的 this 始终继承自其定义时的作用域,而函数 fn2 中的 this 指向的是 obj,而非全局对象 window,因此箭头函数 fn 中的 this 也指向 obj。由于 obj 对象中并没有定义 str 属性,因此会从 obj 的原型链中查找,最终找到了全局对象 window 中的 str 属性,因此输出 window。
<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>
答:代码的输出结果如下:
- "window"
- "object"
- "window"
在全局作用域中,变量str被声明为"window"。在obj对象中,有两个方法:fn和fn2。fn是一个箭头函数,箭头函数的this指向其父级作用域(即全局作用域),所以输出"window"。fn2是一个普通函数,函数内部的this指向obj对象本身,所以输出"object"。fn2返回了一个新的对象,其内部的箭头函数的this仍然指向其父级作用域(即全局作用域),所以输出"window"。
阅读全文