作用域,this,闭包的问题

**

执行上下文**

:不用去管字面意思
由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
待补充

作用域链

本作用域没有定义的变量叫自由变量,找自由变量要去父级作用域,没有找到就去父级的父级…
注意:函数的父级作用域是***函数定义***时的父级,不是执行时的父级

扫描二维码关注公众号,回复: 4716809 查看本文章

闭包:

作用:封装变量,收敛权限

使用场景

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的值

猜你喜欢

转载自blog.csdn.net/qq_36789308/article/details/85393839
今日推荐