您的位置:首页 > Web前端 > JavaScript

js 作用域和闭包1

2017-08-12 16:53 197 查看
1.执行上下文

范围:一段<script>或者一个函数

一段<script>会产生一个全局执行上下文:变量定义、函数声明;

一个函数会产生一个函数执行上下文:变量定义、函数声明、this、arguments;

//demo
console.log(a); // undefined
var a = 100;
fn('zhangsan'); // 'zhangsan' 20
function fn(name) {
age =20;
console.log(name, age);
var age;
} // 不推荐这么写

2.函数声明和函数表达式
fn(); //没错
function fn() {
//声明
}

fn1(); // 有错
var fn1 = function() {
//表达式
}

3.this
this要在执行时才能确认,定义时无法确认;

//demo
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

4.this使用的几种情况
作为构造函数执行
作为对象属性执行
作为普通函数执行
call    apply    bind
//构造函数
function Foo(name){
this = {}
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)//Window
}
fn()
//call apply
function fn1(name,age){
alert(name)
console.log(this)
}
fn1.call({x:100},'zhangsan',20)
//band
var fn2 = function(name,age){
alert(name)
console.log(this)
}.bind({y:200})
fn2('zhangsan',20)


5.作用域
没有块级作用域
只有函数和全局作用域
//无块级作用域
if(true){
var name = 'zhangsan';
}
console.log(name);
//函数和全局作用域
var a = 100;
function fn() {
var a = 200;
console.log('fn',a);
}
console.log('global', a);
fn();

6.作用域链
var a = 100;
function fn() {
var b = 200;
// 当前作用域没有定义的变量,即自由变量,去它的父级作用域去寻找,这个父级作用域是定义时的,不是执行时的
console.log(a);
console.log(b);
}
fn();

7.闭包
//demo
function F1() {
var a =100;
//返回一个函数
return function () {
console.log(a);
}
}
// f1得到一个函数
var f1 = F1();
var a = 200;
f1() // 100

闭包使用的场景:函数作为返回值;函数作为参数传递
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息