执行上下文
范围:一段<script>或者一个函数
全局:变量定义、函数声明 (一段<script>)
函数:变量定义、函数声明、this、arguments (函数)
PS:注意“函数声明”和“函数表达式”的区别
console.log(a);
var a = 100;
fn('zhangsan');
function fn(name) {
age = 20;
console.log(name, age);
var age;
}
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;
fn1(); //this === window
作为构造函数执行
function Foo(name) {
this.name = name;
return this;
}
var f = new Foo('zhangsan');
作为对象属性执行
var obj = {
name: 'A';
printName: function (){
console.log(this.name);
}
}
obj.printName;
作为普通函数执行
function fn() {
console.log(this);
}
fn();
call apply bind
function fn1(name, age) {
alert(name);
console.log(this);
}
fn1.call({x: 100}, 'zhangsan', 20);
作用域
没有块级作用域
只有函数和全局作用域
作用域链
闭包
闭包的使用场景
函数作为返回值
function F1() {
var a = 100;
//返回一个函数(函数作为返回值)
return function () {
console.log(1);
}
}
//f1得到一个函数
var f1 = F1();
var a = 200;
f1();
函数作为参数传递
范围:一段<script>或者一个函数
全局:变量定义、函数声明 (一段<script>)
函数:变量定义、函数声明、this、arguments (函数)
PS:注意“函数声明”和“函数表达式”的区别
console.log(a);
var a = 100;
fn('zhangsan');
function fn(name) {
age = 20;
console.log(name, age);
var age;
}
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;
fn1(); //this === window
作为构造函数执行
function Foo(name) {
this.name = name;
return this;
}
var f = new Foo('zhangsan');
作为对象属性执行
var obj = {
name: 'A';
printName: function (){
console.log(this.name);
}
}
obj.printName;
作为普通函数执行
function fn() {
console.log(this);
}
fn();
call apply bind
function fn1(name, age) {
alert(name);
console.log(this);
}
fn1.call({x: 100}, 'zhangsan', 20);
作用域
没有块级作用域
只有函数和全局作用域
作用域链
闭包
闭包的使用场景
函数作为返回值
function F1() {
var a = 100;
//返回一个函数(函数作为返回值)
return function () {
console.log(1);
}
}
//f1得到一个函数
var f1 = F1();
var a = 200;
f1();
函数作为参数传递