**
执行上下文**
:不用去管字面意思
由JS预解析产生,其中var声明的提前,并且赋值为undefined,function声明的提前,并且函数内容一起提前
**全局**中(一个script标签):*变量定义var、函数声明function*
**函数**中:*变量定义var、函数声明function、this、arguments*
**注意函数声明和函数表达式的区别
this
this要在执行时才能确认值,定义时无法确认
1.作为构造函数执行
2.作为对象属性执行
3.作为普通函数执行
4.call、apply、bind
1.作为构造函数执行
function Foo(name){
this.name=name
}
var f = new Foo('zhangsan'); //此处执行,即此处this才确认值(this===f)
2.作为对象属性执行
var obj = {
name:'xiaoming',
printName:function () {
console.log(this.name)
}
}
obj.printName(); //此处执行,即此处this才确认值(this===obj)
3.作为普通函数执行
function fn(){
console.log(this)
}
fn(); //此处执行,即此处this才确认值(this===window)
4.call、apply、bind
call
**call**:最常用,参数为一个一个的
function fn (name,age){
alert(name);
console.log(this);
}
fn('zhangsan',20); //此处执行,即此处this才确认值(this===window)
fn.call({x:100},'zhangsan',20); //此处执行,即此处this才确认值(this==={x:100})
apply:参数为数组
function fn1 (name,age){
alert(name);
console.log(this);
}
fn1.apply({x:100},['zhangsan',20]); //此处执行,即此处this才确认值(this==={x:100})
bind: .bind()必须是函数表达式形式
var fn2= function (name,age){
alert(name);
console.log(this);
}.bind({y:200})
fn2('zahngsan',20); //此处执行,即此处this才确认值(this==={y:200})
作用域
const、let、var
待补充
作用域链
本作用域没有定义的变量叫自由变量,找自由变量要去父级作用域,没有找到就去父级的父级…
注意:函数的父级作用域是***函数定义***时的父级,不是执行时的父级
闭包:
作用:封装变量,收敛权限
使用场景
1.函数做返回值
2.函数做参数来传递
function F1(){
var a=100;
return function () {
console.log(a) //自由变量,父作用域在函数定义的地方寻找
}
}
var f1 = F1();
var a=200;
f1(); //100
function F1(){
var a=100;
return function () {
console.log(a) //自由变量,父作用域在函数定义的地方寻找
}
}
var a=200;
var f1 = F1();
function F2(fn){
var a=300;
fn();
}
F2(f1); //100
闭包实际应用
这样外部就只能拿到返回的函数,执行返回的函数的有限功能,不可能对原函数进行修改或者破坏等操作,__属性名,为私有属性,在isFirstLoad外面根本不可能修改掉__list的值