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函数。