最近面试过一些人, 发现即使经验丰富的开发人员, 对于一些基础的理论和细节也常常会模糊. 写本文是因为就我自己而言第一次学习下面的内容时发现自己确实有所收获和感悟. 其实我们容易忽视的javascript的细节还有更多, 本文仅是冰山一角. 希望大家都能通过本文有所斩获.
一. Javascript面向对象
Javascript是一门面向对象的语言, 虽然很多书上都有讲解,但还是有很多初级开发者不了解.
创建对象
ps: 以前写过一篇详细的创建对象的文章(原型方法, 工厂方法等)但是找不到了, 回头如果还能找到我再添加进来.下面仅仅简单介绍.
在C#里我们使用new关键字创建对象, 在javascript中也可以使用new关键字:
- var objectA = new Object();
但是实际上"new"可以省略:
- var objectA = Object();
但是我建议为了保持语法一直, 总是带着new关键字声明一个对象.
创建属性并赋值
在javascript中属性不需要声明, 在赋值时即自动创建:
- objectA.name = "my name";
访问属性
一般我们使用"."来分层次的访问对象的属性:
- alert(objectA.name);
嵌套属性
对象的属性同样可以是任何javascript对象:
- var objectB = objectA;
- objectB.other = objectA;
-
- objectA.name;
- objectB.name;
- objectB.other.name;
使用索引
如果objectA上有一个属性名称为"school.college", 那么我们没法通过"."访问,因为"objectA.school.college"语句是指寻找objectA的school属性对象的college属性.
这种情况我们需要通过索引设置和访问属性:
- objectA["school.college"] = "BITI";
-
alert(objectA["school.college"]);
下面几个语句是等效的:
- objectA["school.college"] = "BITI";
-
var key = "school.college"
-
alert(objectA["school.college"]);
-
alert(objectA["school" + "." + "college"]);
- alert(objectA[key]);
JSON 格式语法
JSON是指Javascript Object Notation, 即Javascript对象表示法.
我们可以用下面的语句声明一个对象,同时创建属性:
-
-
var objectA = {
-
name: "myName",
- age: 19,
- school:
- {
-
college: "大学",
-
"high school": "高中"
- },
-
like:["睡觉","C#","还是睡觉"]
- }
JSON的语法格式是使用"{"和"}"表示一个对象, 使用"属性名称:值"的格式来创建属性, 多个属性用","隔开.
上例中school属性又是一个对象. like属性是一个数组. 使用JSON格式的字符串创建完对象后, 就可以用"."或者索引的形式访问属性:
- objectA.school["high school"];
- objectA.like[1];
静态方法与实例方法
静态方法是指不需要声明类的实例就可以使用的方法.
实例方法是指必须要先使用"new"关键字声明一个类的实例, 然后才可以通过此实例访问的方法.
- function staticClass() { };
-
staticClass.staticMethod = function() { alert("static method") };
-
staticClass.prototype.instanceMethod = function() { "instance method" };
上面首先声明了一个类staticClass, 接着为其添加了一个静态方法staticMethod 和一个动态方法instanceMethod. 区别就在于添加动态方法要使用prototype原型属性.
对于静态方法可以直接调用:
- staticClass.staticMethod();
但是动态方法不能直接调用:
- staticClass.instanceMethod();
需要首先实例化后才能调用:
- var instance = new staticClass();
-
instance.instanceMethod();
二. 全局对象是window属性
通常我们在
然而我们还应该知道, 实际上全局变量objectA是创建在window对象上, 可以通过window对象访问到:
- window.objectA
三. 函数究竟是什么
我们都知道如何创建一个全局函数以及如何调用:
- function myMethod()
- {
-
alert("Hello!");
-
}
- myMethod();
其实同全局对象一样, 使用function关键字创建的方法(也可以创建类)的名称, 实际上是为window对象创建了myMethod属性, 并且值是一个匿名方法, 上面的语句等同于:
- window.myMethod = function()
- {
-
alert("Hello!");
- }
无论使用哪种方式声明, 实际保存时都是使用函数名创建window对象的属性. 并且值只有函数体没有函数名称.
所以,下面三种声明方式是等效的:
- function myMethod()
- {
-
alert("Hello!");
- }
-
window.myMethod = function()
- {
-
alert("Hello!");
- }
-
myMethod = function()
- {
-
alert("Hello!");
- }
四. "this"究竟是什么
在C#中,this变量通常指类的当前实例. 在javascript则不同, javascript中的"this"是函数上下文,不是由声明决定,而是由如何调用决定.因为全局函数其实就是window的属性, 所以在顶层调用全局函数时的this是指window对象.
下面的例子可以很好的说明这一切:
- var o1 = { name: "o1 name" };
-
window.name = "window name";
-
-
function showName()
- {
-
alert(this.name);
- }
-
- o1.show = showName;
- window.show = showName;
-
- showName();
- o1.show();
- window.show();
结果:
结果证明在顶层调用函数和使用window对象调用函数时, this都指向window对象. 而在对象中调用函数时this指向当前对象.
五. javascript中的闭包
闭包的概念比较难以理解, 先看闭包的定义:
闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
简单表达:
闭包就是function实例以及执行function实例时来自环境的变量.
先看下面的例子:
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title></title>
- </head>
- <body>
-
<div id="divResult"></div>
-
<script type="text/javascript">
-
function start()
- {
-
var count = 0;
-
window.setInterval(function()
- {
-
document.getElementById("divResult").innerHTML += count + "<br/>";
- count++;
- }, 3000);
- };
- start();
- </script>
- </body>
- </html>
count是start函数体内的变量, 通常我们理解count的作用于是在start()函数内, 在调用start()函数结束后应该也会消失.但是此示例的结果是count变量会一直存在,并且每次被加1:
因为count变量是setInterval中创建的匿名函数(就是包含count++的函数)的闭包的一部分!
再通俗的讲, 闭包首先就是函数本身, 比如上面这个匿名函数本身, 同时加上在这个函数运行时需要用到的count变量.
javascript中的闭包是隐式的创建的, 而不像其他支持闭包的语言那样需要显式创建.
相关推荐
根据给定的文件信息,以下是对“JavaScript一些技巧”中涉及的关键知识点的详细解析: ### 1. 事件处理:`onBlur`, `onFocus`, `onChange`, `onSelect` 在网页开发中,事件处理是与用户交互的核心部分。`onBlur`...
JavaScript Functional Programming for JavaScript Developers 英文mobi 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
在给定的资源中,"javascript中文转拼音(转载)"是一个关于使用JavaScript实现中文字符转换为拼音的功能。这个功能在多种场景下都非常有用,比如搜索引擎优化(SEO)、语音合成或无障碍阅读等。 `pinyinEngine.full....
Modern JavaScript Applications 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
根据提供的标题、描述、标签及部分内容,我们可以整理出一系列与网页设计及JavaScript相关的实用技巧,以下是对这些技巧的详细介绍: ### 1. 屏蔽鼠标右键 ```javascript oncontextmenu="window.event.returnValue=...
JavaScript Functional Programming for JavaScript Developers 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
Mastering Reactive JavaScript 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
在探讨如何利用JavaScript获取系统时间之前,我们先来理解一下JavaScript中的Date对象,它是处理日期和时间的关键。Date对象提供了多种方法,可以用来获取当前或指定的日期和时间信息,包括年、月、日、小时、分钟、...
JavaScript Concepts 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
JavaScript Patterns 英文azw3 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
Effective JavaScript 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn...
Mastering JavaScript 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn...
JavaScript Novice to Ninja(2nd) 英文无水印pdf 第2版 pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请...
在网页开发中,数据的展示往往需要处理大量信息,这时分页和排序功能就显得尤为重要。JavaScript,作为浏览器端的主要脚本语言,被广泛用于实现...希望这些内容能对你在JavaScript分页和排序方面的学习和实践有所帮助。
JavaScript JSON Cookbook 英文mobi 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
Data Visualization with JavaScript 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
Get Programming with JavaScript 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除