学习Javascript的这个关键字与我

学习Javascript的这个关键字与我
本文仅讨论这个问题。如果我们能正确地回答Javascript中的这个问题,作为一个作者,我会觉得写这样的文章是值得的。

让我们记住一个词:它总是指向函数运行的对象,它不是创建函数时创建的对象,也就是说,谁调用,指向谁…

本文将分为三个案例来分析这个对象到底在哪里。

1,在普通函数中

不管这个位置在哪里,第一件要做的事情是在函数运行时找到函数的位置。

全局;
功能getName(){
var;
返回this.name;
};
警报(getName());
当这出现在全球环境的函数的函数GetName getName,此时的位置是在位置

警报(getName());
显然,这同对象的函数是全局对象,即窗口,所以这会躲在窗口。在这一点上,这个点的窗口对象,并返回的this.name getName实际上是window.name,所以提醒了世界!

然后,当它不出现在全局环境的函数中时,当它出现在本地环境的函数中时,它将被困在什么地方呢
全局;
VaR XPG = {
名称:本地
getName:函数(){
返回this.name;
}
};
警报(xpg.getname());
该功能不在全球环境中,但在XPG环境。无论你在这,一定要找到位置的功能函数时运行,功能同此时的位置
警报(xpg.getname());
显然,getName的目标函数,XPG,所以这将遮蔽XPG,它指向一个对象的this.name XPG getName返回xpg.name,所以警惕的地方!

举例巩固。

var某人{ {
姓名:鲍勃
showName:函数(){
警报(这个名字);
}
};

var
姓名:汤姆
someone.showname showName:
}

other.showname(); / /汤姆

虽然这个关键字声明someone.showname,它运行在other.showname,所以这一点要other.showname功能,当前对象即其他,所以最后提醒出来other.name。

2,这在闭包中

关闭也是一个令人不安的因素。这篇文章谈得不多。简言之,所谓闭包就是在函数内部创建另一个函数,内部函数访问外部变量。

浪子和痞子关闭混合在一起,将永无宁日。啊啊啊啊啊!
全局;
VaR XPG = {
名称:本地
getName:函数(){
返回函数(){
返回this.name;
};
}
};
警报(xpg.getname()());
当时,这显然是一个两难的境地,这是在同功能的匿名函数和匿名函数调用的变量名,所以它构成了一个闭合的,这是,这是关闭的。

无论你在这,一定要找到位置的功能函数时运行。它不是由函数getName此时的位置来判断,而是基于一个匿名函数运行时的位置。
函数(){
返回this.name;
};

显然,在匿名函数的窗口对象,所以这会躲在窗口,于是匿名函数返回this.name是window.name警报,因此全球!

那么,你如何让这个在XPG关闭缓存这
全局;
VaR XPG = {
名称:本地
getName:函数(){
var =;
返回函数(){
返回that.name;
};
}
};
警报(xpg.getname()());
的,这是当时的getName函数在运行位置的getName函数定义
警报(xpg.getname());
这一点对XPG对象,所以还指出,XPG对象。返回关闭匿名功能that.name,然后返回that.name实际上是xpg.name,所以它可以提醒出来的部分!

3,新关键字创建新对象

new关键字后面的构造函数中的这个值指向构造函数构造的新对象:
功能的人(__name){
this.name = __name; / /这一点与构造函数构造新的对象,这个例子是鲍伯对象
}
person.prototype.show =函数(){
警报(这个名称); / /这一点的人,this.name = person.name;
}

Var Bob =新的人();
Bob.show(); / /鲍勃

4,调用此应用程序

可以用Javascript管理的这个估计也是不调用和应用的。

调用和应用就像是父母的,这是生活在这和听!如果没有参数,则当前对象是窗口。
全局;
VaR XPG = {
名称:本地
};
功能getName(){
警报(这个名字);
}
getName(XPG);
getname.call(XPG);
getname.call();
这是在函数调用getName。无论你在这,一定要找到位置的功能函数时运行,功能同此时的位置
getName(XPG);
显然,getName目标函数是窗口,所以这会躲在窗口,它指向一个窗口对象的this.name window.name getName返回,所以全球警报!

然后,调用和应用出现了,因为这必须听从他们的命令!

getname.call(XPG);

其中,称这是在XPG遮挡指定,因此被迫定居在XPG,那么这一点是xpg.name XPG,this.name,所以警惕的地方!

5、在评价

eval函数,它似乎没有指定当前对象时执行,但实际上这并不指向窗口,因为该函数的作用域的范围,即代码将被添加到线。下面的例子说明了这个问题:
窗口;

Var Bob = {
姓名:鲍勃
showName:函数(){
eval(警报(这个名字));
}
};

Bob.showName(); / /鲍勃

6。当前对象没有清除此对象。

如果没有当前对象的显式执行,则指向全局对象窗口。

例如,我们有一个引用全局变量的函数。
var;

Var Bob = {
姓名:鲍勃
显示:函数(){
警报(这个名字);
}
}

VaR显示= bob.show;
显示();

您还可以理解,显示是窗口对象下的方法,所以在执行时当前的对象是窗口,但是本地变量引用的函数不能用这种方式解释:
窗口;

Var Bob = {
姓名:鲍勃
showName:函数(){
警报(这个名字);
}
};

Var Tom = { {
姓名:汤姆
showName:函数(){
VaR的乐趣= Bob.showName;
(有趣);
}
};

Tom.showName(); / /窗口

在浏览器中,对当前对象的setInterval和setTimeout,匿名函数的全局对象窗口,这可以看作是最后的一个特例。
var;
无功nameobj = {
姓名:汤姆
showName:函数(){
警报(这个名字);
},
WaitShowName:函数(){
setTimeout(this.showname,1000);
}
};

nameobj.waitshowname();

所以,当运行this.showname,这个点的窗口,所以它显示在最后window.name。

7,这在DOM事件中

(1)您可以直接在DOM元素中使用它。
分析:对DOM元素一个onclick元素(或其他属性,如事件),它是由HTML元素拥有。它直接在它触发的函数中写入,这应该指向HTML元素。

(2)注册DOM元素的js函数。

不正确的方式
功能试验(){
警报(这个值);
}
分析:onclick事件调用该函数直接和程序将弹出定义。因为该函数定义在窗口对象,

所以业主的考验(范围)是窗口,而这也对窗口,窗口没有价值属性,所以它是错误的。

B,正确的方法
功能试验(){
警报(这个值);
}
文件。getElementById。onclick=考试(btntest ); / /按钮的OnClick事件登记功能
分析:在前面的例子中,在该函数是在全局作用域中定义的(这里是窗口对象),所以这是指当前窗口对象,document.getelementbyid(btntest)。Onclick =考试;这种形式,实际上是btntest onclick属性设置为一个副本的试验功能,对这btntest onclick属性的功能范围,由btntest这所有,也指出btntest。事实上,如果有多个DOM元素来登记的事件,我们可以使用不同的DOM元素的ID,是这样实现的:

文件。getElementById。onclick=考试(domid ); / /按钮的OnClick事件登记功能。
因为许多不同的HTML元素创建不同的函数副本,但每个副本所有者都是对应的HTML元素,它们的副本也指向它们的所有者,这不会引起混淆。

为了验证语句,我们改进了代码,让按钮直接弹出相应的触发器函数:
功能试验(){
此值为提交;
}
VaR建立document.getelementbyid(btntest1 );
警报(BTN。onclick); / /第一个按钮的功能

无功btnother = document.getelementbyid(btntest2 );
BtnOther。onclick=试验;
警报(btnother。onclick); / /二按钮功能

弹射的结果是:

第一个按钮
函数onClick(){
这项测试()
}

第二个按钮
功能试验(){
此值为提交;
}

从以上结果,你必须更透彻地理解。

顺便说一下,一个新函数的每一个拷贝,程序都会为这个函数的拷贝分配一定数量的内存。在实际应用中,大多数函数不一定被调用,而且这部分内存被浪费了。所以我们通常写这个:
功能试验(obj){
警报(obj值);
}
这是因为我们使用的函数参考使用方式和程序分配内存的函数的本体,并参考指定指针。这样,写一个函数,在调用的地方指定一个参考吧,这是更有效的。当然,如果你不没想到这样的注册事件可与各种浏览器兼容,您可以对以下注册事件写一个通用的脚本:
/ / js事件被添加eventutil.addevent(DOM元素、事件名称、事件触发的函数名)去除eventutil.removeevent(DOM元素、事件名称、事件触发的函数名)。
无功eventutil =新eventmanager();

事件总经理DOM元素添加或删除事件
功能eventmanager(){
添加事件
/ / odomelement:DOM元素,如按钮、文本、文件、oeventtype:;*事件的名称(如:点击,如果IE浏览器自动转换点击onclick * ofunc:);事件触发的函数名称
this.addevent =功能(odomelement,oeventtype,ofunc){

如果(odomelement。attachevent){
odomelement.attachevent(+ oeventtype,ofunc);
}
、歌剧、Safari等
如果(odomelement。addEventListener){
ODomElement.addEventListener(oeventtype,ofunc,假);
}
/其他
{其他
odomelement { + oeventtype } = ofunc;
}
}

this.removeevent =功能(odomelement,oeventtype,ofunc){

如果(odomelement。detachevent){
odomelement.detachevent(+ oeventtype,ofunc);
}
、歌剧、Safari等
如果(odomelement。removeEventListener){
ODomElement.removeEventListener(oeventtype,ofunc,假);
}
/其他
{其他
odomelement { + oeventtype } = null;
}
}
}

正如报告中写道,对登记的DOM元素的事件,与eventutil.addevent(DOM元素的事件,名称的事件触发函数名)可以删除,可以这样写:eventutil.removeevent(DOM的事件名称事件触发的函数名),这是方法,不说。

以上就是本文的全部内容,希望通过这篇文章,我们能对Javascript的这一关键点有更多的了解,共同进步。

tag:关键字学习与我电脑软件Javascript

相关内容