this
指当前函数执行的主体(谁执行的函数this就是谁)
函数外面的this是window,我们一般都研究函数内的this指向问题
this是谁和它在哪定义的和它在哪执行的都没有任何关系
function eat(){
console.log(this) //window
}
eat();
function fn(){
function b(){
console.log(this); //window
}
b()
}
fn()
function n(){
console.log(this) //window
}
~function (){
n()
}()
var obj={
fn:function (){
console.log(this)
}
}
obj.fn() //this: obj
var f=obj.fn;
f() //this: window
复制代码
在js非严格模式下this:
1、自执行函数中的this一般都是window
var obj={
fn:(function(){
// this window
return function(){}
})()
}
复制代码
2、给元素的某个事件绑定方法,当事件触发执行对应事件的时候,方法中的this一般都是元素本身
oBox.onclick=function(){
//this : oBox
}
复制代码
3、还有一种方式能快速区分this:当方法执行的时候,看方法前边是否有 .
:有 .
, .
前边是谁this就是谁,没有 .
this一般就是window
var obj={
fn:function (){
console.log(this)
}
}
obj.fn() //this :obj
var f=obj.fn;
f() //this:window
复制代码
在js严格模式下this:
开启js严格模式:在当前作用域的第一行加上
"use strict"
开启严格模式,那么当前作用域下再 执行js代码都是按照严格模式处理的
如果执行主体不明确,this指向的是undefined(非严格模式下指向的是window)
"use strict"
function fn(){
console.log(this);
}
fn() //=>this:undefined
window.fn() //=> this:window
复制代码
案例
function fn(){
//this:window
console.log(this)
}
document.body.onclick=function(){
//this:body
fn(); //执行前边没`.`this : window
}
复制代码
//window全局作用域
//变量提升 var num; var obj;var fn;
//执行代码 num=1;
//开辟堆内存空间 aaaffff000
//存储键值对 num = 2; fn:自执行函数返回的结果
//自执行函数执行形成私有作用域A (栈内存A是不能被销毁的 因为被 obj.fn使用了)
//形参赋值 num = 1
//变量提升 没有
//代码执行
//this.num*=2 (this 是window) 全局num=2
//num+=2 (私有的形参) 私有的num =3
//return 一个函数(引用数据类型)
//开辟一个堆内存空间 AAAFFF111
//存储字符串
//return AAAFFF111
//fn =AAAFFF111
//把aaaffff000 赋值给 obj
//fn=obj.fn; fn = AAAFFF111
//fn() 找到AAAFFF111 形成私有作用域B
//形参和变量提升都没有
//this.num*=3; this为window 全局 num=6
//num++;私有作用域中没有向上找到私有作用域A的形参 私有的num =4
//打印 4
//作用域B销毁
//obj.fn() 还是找到AAAFFF111 形成私有作用域
//形参和变量提升都没有
//this.num*=3; this为obj obj num=6
//num++;私有作用域中没有向上找到私有作用域A的形参 私有的num =5
//打印 5
//作用域 销毁
// 全局 num =6
// obj num=6
//销毁堆内存
//fn=null;
//obj.fn=null
//obj=null
//4 5 6 6
var num=1;
var obj={
num:2,
fn:(function(num){
this.num*=2;
num+=2;
return function(){
this.num*=3;
num++; //主要在于 这个num是上级作用域的
console.log(num)
}
})(num)
}
var fn=obj.fn;
fn();
obj.fn();
console.log(num,obj.num)
复制代码
异步 同步
同步:
js当中当前这个任务没有完成,下面的任务都不会执行,只有等当前任务彻底完成才会执行下面的任务
异步:
js当中当前这个任务没有完成,需要等一会儿才能完成,此时我们可以继续执行下面的任务
所有的事件绑定都是异步编程,不用等执行就能接着做别的事情
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END