JavaScript在这个函数中的指向和例子的详细解释
首先,这实际上可以与成年人相比
说到这个,我们主要在js中研究这个。在javascript中,这表示当前行为的执行主体,而上下文表示当前行为执行的环境(区域)。
比如北丽珠里的男神吃饭,这句话的意思如下
男神——主体(本)
饮食功能
贝丽珠-环境(语境)
-描述:吃饭是一种功能,男神是功能的主体,贝丽珠是当前行为的执行语境。主语不一定和语境有关,主语只和功能有关;就像男神吃饭一样,其实他在哪里都可以吃。吃饭的主体永远是男神,环境可以改变。
-结论:其实可以解释,这指的是谁,与函数在哪里定义和执行无关。
二、在功能上,如何区分这一点
1.执行函数时,首先要看是否有“.”在函数名前面。如果是这样,谁在“前面”,这是谁;如果没有,这是窗口
//示例1 console . log(this);函数eat(){ console . log(this);//this-window } ~函数(){ eat();//this-window }();//示例2函数fn(){ console . log(this);} var obj={ fn: fn }fn();//this-windowobj . fn()//this-obj//示例3函数sum(){ fn();} sum();//this-window //示例4 varoo={ sum : function(){ console . log(this);fn();} } oo . sum();//首先,在sum函数中,第一个输出这是oo;然后执行fn(),这是window2,而这在立即执行函数中永远是window
(function(){ console . log(this);//this-window})()3。将方法绑定到元素的事件。当事件被触发时,执行相应的方法,其中这是当前元素
函数fn(){ console . log(this);}//示例1 document.getelementbyid ('div 1 ')。onclick=fn//this-dom元素//示例2 document.getelementbyid ('div 1 ')。onclick=function(){ console . log(this);//this-# div fn();//this-window}结论:找出函数在哪里执行,有点,这是之前的重点;没有意义,这是窗口
第三,用这个来分析一个面试问题
var num=20var obj={ num: 30,fn :(function(num){ this . num *=3;num=15var num=45return function(){ this . num *=4;num=20console . log(num);} })(num)};var fn=obj . fn;fn();//-65 obj . fn();///-85 console . log(window . num,obj . num)///-240,120上面的代码用栈图来描述,如下:首先,正方形表示栈内存(函数执行环境,上下文),带圆边的正方形表示堆内存(用于存储字符串)。
第一步是形成一个js执行环境,窗口范围,先预解释(声明var,声明和定义函数);
第二步,从上到下执行代码,num=20,obj=引用数据类型(数据存储在堆内存中)
第三步,由于obj.fn是立即函数,形成私有作用域A,执行fn内部的函数。因为fn内部的函数返回一个函数,返回值被外部的obj.fn引用,所以这个立即函数A的作用域不会被破坏。
第四步,窗口范围下的代码继续执行。
第四,这一点的实际应用
现在有一个要求是累加器,每次点击都会累加1。
var oBtn=document . getelementbyid(' BTN ');var SPannum=document . getelementbyid(' SPannum ');//方法1//利用全局范围不被破坏的原则,将待累加的个数定义为全局变量var count=0;obtn . onclick=function(){ count;spanNuM.innerText=计数;}//缺点:为了防止项目中全局变量之间的冲突,我们一般会禁止或者减少全局变量的使用。//方法2//形成一个不被破坏的私有作用域来保存我们需要积累的数据。//1)(function(){ var count=0;obtn . onclick=function(){ count;spanNum.innerText=计数;} })//2)obtn . onclick=(function(){ var count=0;返回函数(){ countspanNum.innerText=计数;} })//以上两种写法都表达了同一个意思。//缺点:有一个不被破坏的私有范围,占用一点内存。//方法3//使用innerHTML进行处理。每次点击都需要去页面获取最新的值,然后累加,最后把结果放到obt n . onclick=function(){ spannum . innerhtml;}//缺点:获取innerHTML时需要浏览器进行处理。每次页面的内存都需要转换成字符串,然后累加,再加回来。再次添加时,浏览器需要再次呈现页面。//方法4//使用自定义属性存储(推荐!)obtn . count=0;obtn . onclick=function(){ SPannum . innertxt=this . count;}//注意这里的计数只是一个对象的属性,既不是全局变量,也不是局部变量。以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
版权声明:JavaScript在这个函数中的指向和例子的详细解释是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。