问题 1:
let 声明的函数:
let f = function(){return this};
f(); //window{...}
f 没有绑定到window对象,为什么返回window对象,因为这个匿名函数绑定了?
还是只要记住 普通函数的this都是window。
问题2:
let nn = 3;
window.nn = 4;
console.log(nn); // 3
window.nn = 4;
console.log(nn); // 4
var nn = 3;
window.nn = 4;
console.log(nn);
全局变量 好像分成了三种,window.nn , var nn , let nn .
很迷惑。
问题1:
f函数中的this和f变量的作用域没什么关系。
this是函数所操作的对象。
每个function函数(非箭头函数)在每次调用时都会在函数内生成一个自己的this。
当两个函数嵌套定义时,内层函数中的this与外层函数中的this是完全独立的。
函数内this的值是在函数调用时才确定的,函数的调用方式不同,this也就不同。
比如有一个函数名字是func。
1,当函数直接调用时 func(); 函数内this的值是window对象,(在js严格模式"use strict";下,函数内this的值是null)
2,当把这个函数赋值给一个对象的方法obj.abc = func;
调用obj.abc()时,函数内this的值是obj对象,也就是函数所在的对象。
3,当把这个函数赋值给一个dom元素的事件 document.getElementById("id").onclick= func;
在事件触发时,函数内this的值是触发事件的那个dom元素。
4,当把这个函数作为构造函数使用时 new func();函数内this的值是一个新创建的对象。
5,当函数以 func.call(obj); 或 func.apply(obj); 方式调用时, 函数内this的值是call()或apply()方法的第一个参数。
6,当用 func2 = func.bind(obj); 返回一个新的函数。
不论func2函数用什么方式调用,函数内this的值永远都是bind()方法的第一个参数。
7,如果func是一个箭头函数 (x)=>{} ,箭头函数内没有自己的this。
如果在箭头函数内使用this,访问的是外层函数的this。
你f函数是直接调用的,函数内this的值就是window对象
问题2:变量是分三种,
1,全局变量(在所有函数外用var声明)
2,函数级局部变量(函数内用var声明, 只能在这个函数中访问)
3,语句块级局部变量(在语句块{}中用let声明, 只能在这个语句块{}中访问)
window对象的属性也等同是全局变量
所以 window.nn 等同于 在所有函数外用var nn
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!