一、JS的理解
1.闭包
定义:闭包就是一个绑定了执行环境的函数,它利用了词法作用域的特性,在函数嵌套时,内层函数引用外层函数作用域下的变量,并且内层函数在全局环境下可访问,就形成了闭包。
条件:在函数嵌套的前提下;内部函数使用了外部函数的变量、参数;外部函数返回了内部函数
作用:读取函数内部的变量;让变量的值始终保持在内存中,不会在函数调用后被自动清除。
闭包可以用于:
- 模块化开发
- 封装变量
- 延续局部变量寿命
- 防止变量污染全局
- 实现私有成员
2.this指针
在 JavaScript 中,this 指针是一个特殊的关键字,用于引用当前代码执行时的上下文对象。
this 关键字在不同的上下文中可以有不同的含义。在全局上下文中,this 指向全局对象,通常是 window 对象。而在函数中,this 可能指向不同的对象,具体取决于函数的调用方式。
如果函数是作为一个方法被调用的,那么 this 就指向调用该方法的对象。例如: const obj = { name: 'Alice', sayName() { console.log(this.name); } };
obj.sayName(); // 输出:Alice
在这个例子中,sayName() 方法被调用时,它的 this 关键字指向了 obj 对象。
如果函数不是作为一个方法被调用,而是直接被调用,那么 this 就指向全局对象。例如:
function sayName() { console.log(this.name); }
sayName(); // 输出:undefined
在这个例子中,sayName() 函数被直接调用时,它的 this 关键字指向了全局对象,因为没有指定它的调用对象。
除了作为方法或函数被调用时,this 关键字还可以用于构造函数中。在这种情况下,this 指向的是当前创建的对象。例如: function Person(name) { this.name = name; }
const alice = new Person('Alice'); console.log(alice.name); // 输出:Alice
在这个例子中,Person 函数被用作构造函数,当使用 new 关键字创建对象时,this 指向的是新创建的对象。
需要注意的是,在箭头函数中,this 的值是由上下文决定的,而不是被调用时决定的。箭头函数中的 this 关键字指向的是箭头函数所在的作用域中的 this,而不是调用箭头函数的对象。例如: const obj = { name: 'Alice', sayName: () => { console.log(this.name); } };
obj.sayName(); // 输出:undefined
在这个例子中,obj 对象的 sayName 方法是一个箭头函数,它的 this 关键字指向的是 obj 所在的作用域中的 this,而不是 obj 对象本身。由于在全局作用域中没有定义 name 属性,因此输出为 undefined。