this
this要在执行的时候才能有确认值,定义是无法确认
var a = {
name: 'A',
fn: function () {
console.log(this.name)
}
}
a.fn() //this === a
a.fn.call({
name: 'B' //this === {name:'B'}
})
var fn1 = a.fn // this === window
fn1()
作用域
js没有块级作用域 只有全局和函数作用域
if (true) { //无块级作用域
var name = 'james'
}
console.log(name)
var a = 100
//全局和函数作用域
function foo() {
var a = 2020
console.log('fn', a)
}
console.log(a)
作用域链
当代码在一个环境中执行时,会创建变量对象的一个作用域链。
当在内部函数中,需要访问一个变量的时候,首先会访问函数本身的变量对象,是否有这个变量,如果没有,那么会继续沿作用域链往上查找,直到全局作用域。如果在某个变量对象中找到则使用该变量对象中的变量值。
闭包
函数与对其状态即词法环境(lexical environment)的引用共同构成闭包(closure)。也就是说,闭包可以让你从内部函数访问外部函数作用域。
function init() {
var name = "Mozilla"; // name 是一个被 init 创建的局部变量
return function displayName() { // displayName() 是内部函数,一个闭包
console.log(name); // 使用了父函数中声明的变量
}
}
var f = init();
var name = 'james'
f() //Mozilla
function init2(fn) {
var name = 'james'
fn()
}
var f = init();
init2(f)//Mozilla
常用于 函数作为返回值 和函数作为参数传递