当你使用Javascript,你常常被这家伙迷惑。这个OOP开发经验为广大开发者的共同元素的标识符是指当前的范围,但在Javascript看起来怪怪的,因为它不是固定的,而是随环境变化的实施。在Javascript,这总是指向对象调用它的方法。

举个简单的例子:

复制代码代码如下所示:

函数测试(){

警戒(此);

}

var obj =函数(){

变量名= 'testobj;

}

objtest =测试对象;

测试();

obj.objtest();



将此代码放入HTML运行该页,您将看到一个警告{对象窗口}的第一个警告,然后是第二个警告。

复制代码代码如下所示:

var obj =函数(){

变量名= 'testobj;

}



我们首先定义一个测试()方法,并打电话提醒的方法(这)方法将显示,然后定义了一个obj对象的功能,并给它一个私有字段的名称,并给它一个静态方法(objtest),这个功能直接指向测试()函数。

呼叫测试()和()方法obj.objtest分别,第一次警告对话框窗口对象,第二提示对象我们所定义的代码。这表明,测试函数的值在这两个执行时间不同!

这表明,当调用函数的对象的不同,该关键字的作用是不同的。这里值得注意的是,Javascript是基于对象的语言,当我们的时间变量或函数定义在根的标签是相当于相应的属性或方法的窗口对象,所以当我们使用的功能(测试){ }当代码定义了一个函数,实际上相当于一个窗口对象添加了一个新的功能,即window.test(功能)。

我们可以做一个实验:

复制代码代码如下所示:

函数测试(){

警戒(此);

}

警报(测试窗口);



警告框会提示正确,这意味着我们调用测试时()函数,它相当于window.test呼叫()。所以当我们调用测试()函数,对象,调用这个函数实际上是窗口对象,这指的是窗口对象,所以当我们警觉(这),警告窗口的内容是{对象窗口}。我们将相当于obj.objtest(obj。objtest =测试)测试(),所以当我们打电话给obj.objtest()函数是等价的对象调用测试()这个函数,所以现在这是指一个obj的对象,这是我们看到的代码的目标函数。

说到这一点,应该解释得太多。也许上面的例子太抽象了,不能想象它能用在什么情况下。现在让我们假设一个要求,并做一个接近实际的例子。

假设我们的页面中的所有超链接在点击后被转换为红色,并在Javascript中实现。一般的想法应该是获取页面中的所有标签,然后浏览所有的标签,注册每一个点击事件并触发事件,我们将颜色值设置为红色。

示例代码如下所示:

复制代码代码如下所示:

更改颜色

功能换色(){

这个风格。颜色=# F00;

}

初始化,是所有已注册事件的标记。

函数init(){

无功customlinks = document.getelementsbytagname(A);

对(我在customlinks){

您还可以注册事件事件监听器模式。

由于IE的兼容性,浏览器可能需要更多的代码,你可以自己编写。

customlinks {我} onclick=变色;

}

}

指针初始化窗口;



将此代码添加到HTML文件中,并在文档中添加一些超链接,点击链接时颜色会变红,我们这里定义的换色()函数在该关键字的点击链接触发功能,它指的是超链接。如果你打电话给换色()函数浏览器直接,你会是错的,提示错误:这个风格为空或不是一个对象或未定义的错误。

我不知道这是否能让你对Javascript的这个关键词有所了解,你正在看这篇文章,还是你不耐烦(::P)

事实上,为了深入了解这个问题,我们必须对Javascript的范围和范围链有深入的了解。

范围,顾名思义,指的是具有访问权限的属性或方法的代码空间,这只是代码中这个变量或方法的应用范围。这里没有解释三种作用域。如果有编程经验,我们应该有一个深入的了解。我想说的是,这三种类型的范围为Javascript几乎毫无意义,因为Javascript只有一种公共范围,并在Javascript的范围保持功能。例如 uff1a

复制代码代码如下所示:

var test1 = 'globle变量;

函数示例(){

VaR test2 = 'example变量;

警报(test1);

警报(个);

}

例();

警报(test1);

警报(个);



根据我们的解释,这里的一个属性变量test1相当于窗口,所以它将在窗口的领域发挥作用,并在实例test2()的内部声明的功能,所以它的范围将维持在例()方法,如果外部调用test2浏览器会提示错误的功能调用test1,里面的例子()是没有问题的。

根据这一点,我们可以再举一个例子。

复制代码代码如下所示:

'globle变量VAR检验=;

函数示例(){

'example变量VAR检验=;

}

例();

警报(测试);



这个例子的结果是什么是的,警告框提示全局变量,因为示例()函数中的测试变量只在其作用域内保持,并且不影响外部测试变量。你可以自己试一下。

这是另一个概念,这是一个行动链的概念,一个行动链是决定一个变量值的路径。如果变量使用var关键字声明,那么他可以看到它作为范围链的端点。

说到这里,你对这个精灵古怪的家伙有了更清楚的了解吗根据它的简单注释,这总是指对象调用它的函数。根据范围和范围链,我们将清楚地定义这一点的真实面貌。

复制代码代码如下所示:

函数测试(){

警戒(此);

}

var obj =函数(){

Var name='testObj';

}

objtest =测试对象;

obj。objtest2 =函数(){

测试();

}

测试();

obj.objtest();

obj.objtest2();



您有什么建议你可以试着运行它(P);

由于这是根据调用函数的对象的变化而改变的,我们可以强制它改变它的调用对象吗答案是肯定的。后面的文章将介绍这一部分,以及Javascript、闭包等不同类型数据成员的实现。

我在学习过程中学到了一些经验和经验。我写这封信是为了和大家分享。此外,我还可以检查我的缺点,比如写问题,批评和提建议,非常感谢。