深入分析了这个关键字在javascript编程中的使用

深入分析了这个关键字在javascript编程中的使用
Javascript到底是什么很多人会告诉你这指的是当前对象,对吗在大多数情况下,这是真的,例如,我们经常网页上写这样的javascript。

这显然是指当前对象,提交按钮。一般情况下,我们使用的情况类似于此,但情况不是这样的吗

让我们看一看这个例子。
函数(){()
console.log(本);
}
(富);
新富();
通过比较富()和新的富()的运行结果,您会发现前者并不是指富本身,而是当前页面的窗口对象,它实际上指向富。为什么呢

事实上,这涉及到Javascript的一个重要特征,即所谓的封闭。封闭的概念是复杂的,不复杂,但并不是简单的可以用在一个或两个句子。我会在以后的文章中探讨这个Javascript最重要的特征。现在,我想告诉你,因为闭包的存在,对Javascript的范围变得相当重要。

所谓的范围,简单地说,是在创建一个函数时创建了什么环境,如果没有指定,这个变量的值就是函数的当前作用域。

在前面的例子中,富()函数在全局范围(这里是窗口对象),所以这是当前窗口对象的值,并且以新的富()的形式,它实际上创建了一个复制()并在副本上操作,所以这是富()的拷贝。

这可能有点抽象,你看一个实际的例子:

函数演示(){
this.value = Math.random();
}

如果直接调用demo()函数,程序会出错,因为演示函数是在窗口对象中定义的,所以演示(范围)的所有者是窗口,演示这个窗口,窗口不是value属性,所以错误
如果我们通过创建一个副本将这个函数的一个副本添加到HTML元素中,那么他的所有者就变成了元素。这也指这个元素。
document.getelementbyid(按钮)。Onclick =演示;
这将设置一个按钮来复制演示onlick属性(),而这也点一个按钮。
您甚至可以为多个不同的HTML元素创建一个不同的函数副本。每个副本的所有者都是相应的HTML元素,它们各自的这一点指向它们的所有者,并且不会引起混淆。
但如果你以这种方式定义一个元素的onlick事件:
点击这个按钮后,你会发现程序又错了,这又指向了窗口!

事实上,这种方法不为程序创建函数,但只引用函数。

让我们看看差别。

使用创建函数副本的方法:

VAR按钮= document.getelementbyid(按钮);
函数演示(){
this.value = Math.random();
}
按钮的onclick =演示;
警报(按钮onclick);

输出是:
函数演示(){
this.value = Math.random();
}
使用函数引用的方法:

VAR按钮= document.getelementbyid(按钮);
函数演示(){
this.value = Math.random();
}
警报(按钮onclick);

输出是:
函数onClick(){
演示();
}
所以你可以看到其中的差别。在函数参考的方式,onclick事件只是调用演示()函数直接,而演示的范围()函数仍然是窗口对象,所以这仍然指向窗口。
这就引出了一个问题:因为函数的拷贝非常好,为什么我们需要函数引用的方法呢答案是性能。每个功能的复制,程序将对函数的副本分配一定的内存量,在实际应用中,大部分功能不一定叫,这部分内存是浪费。利用函数参考,程序只分配内存的函数的本体,并参考指定指针,这是更有效的。程序员,主体经济,恩

让我们来看一个更好的解决方案:
功能演示(obj){
obj.value = Math.random();
}

这样,效率和需求都可以考虑进去。
这个方向

不是因为在运行期间,其结合的特点,这在Javascript可以全局对象,对象或任何对象,这完全取决于调用函数的方式。有调用Javascript的函数的几种方式:作为对象的方法调用,因为函数调用,因为构造函数调用,并调用的应用或致电。俗话说,话不为表和表不好,如图一样好。为了更好的理解这是指着什么Javascript呢以下是图片说明。
上面的图被称为Javascript这个决策树(非严格模式):
var点{ { {
X:0,
y:0,
MoveTo:函数(x,y){
这个;
这个;
}
};
解释:point.moveto / /决策树(1,1)称新的不是一个函数,不进入决策,
/ /点(。)之前调用对象调用to.moveto,即点
Point.moveTo(1,1); / /这是绑定到当前对象,即重点对象
确定point.moveto过程()函数在Javascript这个决策树是这样的:

1)是point.moveto函数调用调用新的吗这显然不是,进入分支,也就是,用点()调用的函数吗;

2)的point.moveto调用函数的点(。),即进入分支,即在这里点的point.moveto。前一个对象点;

分析图是这个图形point.moveto功能指的是如下图所示:
例如,看看下面的代码:
函数函数(x){
这个;
}
函数(5);这是一个全局对象窗口,x是一个全局变量。
决策树分析:函数()函数是用新调用的吗是否可以用圆点输入函数()函数不管是否,这指向全局对象窗口。
5
在Javascript中确定函数()函数的过程是这个决策树:

1)函数(5)调用是用新调用的吗这显然不是,进入分支,也就是,用点()调用的函数吗;

2)函数(5)不是由点()调用的,也就是说,是否进入分支,也就是说,这里这里指的是全局变量窗口,所以这个x实际上是窗口。

下图所示的图形函数函数指向的是一个解析图,如下图所示:
看看直接调用函数的方法,下面是一个复杂的例子:
var点{ { {
X:0,
y:0,
MoveTo:函数(x,y){
内部函数
VaR Movex =函数(x){
这个。x = x;这个/这个指向什么窗口
};
内部函数
无功movey =功能(Y){
这个,y,y;这个点指向什么窗口
};
MoveX(X);
MoveY(Y);
}
};
Point.moveTo(1,1);
点x;0
点:y;0
x 1;
y;1
的point.moveto(1,1)函数实际调用Movex()和()函数,movey和这里面的Movex()函数决定在Javascript这个决策树的过程。

1)是继续前进(1)函数调用,调用新的吗这显然不是,进入分支,也就是,用点()调用的函数吗;

2)Movex(1)函数不调用点(),即是否进入分支,即,这里指的是全局变量窗口,所以这实际上是X。X窗口。

下面是构造函数调用的一个示例。
函数点(x,y){
这个。
这个。
}
新点(1,1);
1;
var p点(2,2);
P.; / /错误,P是一个空对象定义
窗口2
在这个决策树中,新的点(1,1)的点(1,1)函数是由这一点决定的。

1)新调用的var =新点(1,1)调用吗显而易见的是,条目是分支,也就是说,这指向NP;

2)然后,x=1,也就是,x=1;

点(2,2)功能是通过在VAR P =点确定(2,2)在Javascript这个决策树。

1)是无功P =点(2,2)调用调用新的吗这显然不是,进入分支,也就是,用点()调用的函数吗;

2)点(2,2)功能不是由点(。)不管是否,也就是说,这里指向全局变量窗口,然后这个x实际上是窗口;

3)这个x = 2是窗口= x = 2。

最后,看看调用和应用程序调用的函数示例。
函数点(x,y){
这个;
这个,y = y;
this.moveto =函数(x,y){
这个;
这个,y = y;
}
}

新的点(0, 0);
var = x:0,y:0 };
p1.moveto.apply(P2,{ 10, 10 }); / /申请实际上是p2.moveto(10,10)
10

确定p1.moveto.apply过程(P2,{ 10,10 })函数在Javascript这个决策树是这样的:

我们知道这两种应用方法和调用方法都非常强大。他们允许切换上下文(语境)功能函数的执行,即本binding.p1.moveto.apply对象(P2,{ 10,10 })实际上是p2.moveto(10,10)。然后p2.moveto(10,10)可以解释为:

1)是p2.moveto(10,10)调用的函数被称为新的吗这显然不是,进入分支,也就是,用点()调用的函数吗;

2)的p2.moveto(10,10)函数调用点(。),即进入分支,在这一点p2.moveto(10,10)。上一个对象是P2 = 10。

Javascript函数执行环境的过程中,描述的感觉IBM developerWorks文档库是非常好的,以下摘录:

Javascript的函数可以执行为一个共同的功能,或作为一个对象的方法,这是导致这一内涵丰富的主要原因。执行一个函数,将创建一个执行环境(ExecutionContext),所有行为的作用发生在这个执行环境,构建执行环境,Javascript首先创建一个可变的参数,包含一个参数在调用函数时,创建一个作用域链,然后初始化变量,首先初始化函数的参数表,该值在参数变量的对应值,如果参数变量没有对应的值,参数初始化为不确定。如果函数包含一个内部函数,内部函数初始化。如果没有,继续初始化局部变量在函数内部定义的,需要注意的是,这些变量初始化为未定义,执行环境的任务(ExecutionContext)创建成功,执行会执行这个功能,对于我们理解Javascript中的变量范围是非常重要的,鉴于篇幅,我们这里先不讨论这个话题。最后,这个变量被赋值给这个全局对象,当前对象,等等,如前所述,在这一点上,执行环境(ExecutionContext)的功能是创建成功,且功能执行的行行。所有的变量都需要从先前建立的执行环境(ExecutionContext)读。

理解这个短语将有助于理解Javascript函数。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部