最近面试过一些人, 发现即使经验丰富的开发人员, 对于一些基础的理论和细节也常常会模糊. 写本文是因为就我自己而言第一次学习下面的内容时发现自己确实有所收获和感悟. 其实我们容易忽视的javascript的细节还有更多, 本文仅是冰山一角. 希望大家都能通过本文有所斩获.

一. Javascript面向对象

Javascript是一门面向对象的语言, 虽然很多书上都有讲解,但还是有很多初级开发者不了解.

创建对象

ps: 以前写过一篇详细的创建对象的文章(原型方法, 工厂方法等)但是找不到了, 回头如果还能找到我再添加进来.下面仅仅简单介绍.

在C#里我们使用new关键字创建对象, 在javascript中也可以使用new关键字:

  1. var objectA = new Object();

但是实际上"new"可以省略:

  1. var objectA = Object();

但是我建议为了保持语法一直, 总是带着new关键字声明一个对象.

创建属性并赋值

在javascript中属性不需要声明, 在赋值时即自动创建:

  1. objectA.name = "my name";

访问属性

一般我们使用"."来分层次的访问对象的属性:

  1. alert(objectA.name);

嵌套属性

对象的属性同样可以是任何javascript对象:

  1. var objectB = objectA;
  2. objectB.other = objectA;
  3. //此时下面三个值相当, 并且改变其中任何一个值其余两个值都改变
  4. objectA.name;
  5. objectB.name;
  6. objectB.other.name;

使用索引

如果objectA上有一个属性名称为"school.college", 那么我们没法通过"."访问,因为"objectA.school.college"语句是指寻找objectA的school属性对象的college属性.

这种情况我们需要通过索引设置和访问属性:

  1. objectA["school.college"] = "BITI";
  2. alert(objectA["school.college"]);

下面几个语句是等效的:

  1. objectA["school.college"] = "BITI";
  2. var key = "school.college"
  3. alert(objectA["school.college"]);
  4. alert(objectA["school" + "." + "college"]);
  5. alert(objectA[key]);

JSON 格式语法

JSON是指Javascript Object Notation, 即Javascript对象表示法.

我们可以用下面的语句声明一个对象,同时创建属性:

  1. //JSON
  2. var objectA = {
  3. name: "myName",
  4. age: 19,
  5. school:
  6. {
  7. college: "大学",
  8. "high school": "高中"
  9. },
  10. like:["睡觉","C#","还是睡觉"]
  11. }

JSON的语法格式是使用"{"和"}"表示一个对象, 使用"属性名称:值"的格式来创建属性, 多个属性用","隔开.

上例中school属性又是一个对象. like属性是一个数组. 使用JSON格式的字符串创建完对象后, 就可以用"."或者索引的形式访问属性:

  1. objectA.school["high school"];
  2. objectA.like[1];

静态方法与实例方法

静态方法是指不需要声明类的实例就可以使用的方法.

实例方法是指必须要先使用"new"关键字声明一个类的实例, 然后才可以通过此实例访问的方法.

  1. function staticClass() { }; //声明一个类
  2. staticClass.staticMethod = function() { alert("static method") }; //创建一个静态方法
  3. staticClass.prototype.instanceMethod = function() { "instance method" }; //创建一个实例方法

上面首先声明了一个类staticClass, 接着为其添加了一个静态方法staticMethod 和一个动态方法instanceMethod. 区别就在于添加动态方法要使用prototype原型属性.

对于静态方法可以直接调用:

  1. staticClass.staticMethod();

但是动态方法不能直接调用:

  1. staticClass.instanceMethod(); //语句错误, 无法运行.

需要首先实例化后才能调用:

  1. var instance = new staticClass();//首先实例化
  2. instance.instanceMethod(); //在实例上可以调用实例方法

二. 全局对象是window属性

通常我们在

然而我们还应该知道, 实际上全局变量objectA是创建在window对象上, 可以通过window对象访问到:

  1. window.objectA

三. 函数究竟是什么

我们都知道如何创建一个全局函数以及如何调用:

  1. function myMethod()
  2. {
  3. alert("Hello!");
  4. }
  5. myMethod();

其实同全局对象一样, 使用function关键字创建的方法(也可以创建类)的名称, 实际上是为window对象创建了myMethod属性, 并且值是一个匿名方法, 上面的语句等同于:

  1. window.myMethod = function()
  2. {
  3. alert("Hello!");
  4. }

无论使用哪种方式声明, 实际保存时都是使用函数名创建window对象的属性. 并且值只有函数体没有函数名称.

所以,下面三种声明方式是等效的:

  1. function myMethod()
  2. {
  3. alert("Hello!");
  4. }
  5. window.myMethod = function()
  6. {
  7. alert("Hello!");
  8. }
  9. myMethod = function()
  10. {
  11. alert("Hello!");
  12. }

四. "this"究竟是什么

在C#中,this变量通常指类的当前实例. 在javascript则不同, javascript中的"this"是函数上下文,不是由声明决定,而是由如何调用决定.因为全局函数其实就是window的属性, 所以在顶层调用全局函数时的this是指window对象.

下面的例子可以很好的说明这一切:

  1. var o1 = { name: "o1 name" };
  2. window.name = "window name";
  3. function showName()
  4. {
  5. alert(this.name);
  6. }
  7. o1.show = showName;
  8. window.show = showName;
  9. showName();
  10. o1.show();
  11. window.show();

结果

window name

o1 name

window name

结果证明在顶层调用函数和使用window对象调用函数时, this都指向window对象. 而在对象中调用函数时this指向当前对象.

五. javascript中的闭包

闭包的概念比较难以理解, 先看闭包的定义:

闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

简单表达:

闭包就是function实例以及执行function实例时来自环境的变量.

先看下面的例子:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <title></title>
  5. </head>
  6. <body>
  7. <div id="divResult"></div>
  8. <script type="text/javascript">
  9. function start()
  10. {
  11. var count = 0;
  12. window.setInterval(function()
  13. {
  14. document.getElementById("divResult").innerHTML += count + "<br/>";
  15. count++;
  16. }, 3000);
  17. };
  18. start();
  19. </script>
  20. </body>
  21. </html>

count是start函数体内的变量, 通常我们理解count的作用于是在start()函数内, 在调用start()函数结束后应该也会消失.但是此示例的结果是count变量会一直存在,并且每次被加1:

因为count变量是setInterval中创建的匿名函数(就是包含count++的函数)的闭包的一部分!

再通俗的讲, 闭包首先就是函数本身, 比如上面这个匿名函数本身, 同时加上在这个函数运行时需要用到的count变量.

javascript中的闭包是隐式的创建的, 而不像其他支持闭包的语言那样需要显式创建. 我们在C#语言中很少碰到是因为C#中无法在方法中再次声明方法. 而在一个方法中调用另一个方法通常使用参数传递数据.

转载于:https://www.cnblogs.com/kevinge/archive/2011/10/20/2218639.html

javascript 基础 转相关推荐

  1. JavaScript基础笔记集合(转)

    JavaScript基础笔记集合 JavaScript基础笔记集合   js简介 js是脚本语言.浏览器是逐行的读取代码,而传统编程会在执行前进行编译   js存放的位置 html脚本必须放在< ...

  2. javascript基础语法——表达式

    前面的话 一般地,关于javascript基础语法,人们听得比较多的术语是操作符和语句.但是,其实还有一个术语经常使用,却很少被提到,这就是javascript表达式(expression).本文将详 ...

  3. Javascript基础与面向对象基础~第四讲 Javascript中的类对象

    今天来说JS中如何实现类(class),事实上本应该昨天晚上写的,可我失言了,在些说一声"抱歉"!JS中的类是JS面向对象的基础,也是我最拿手的东西,你写的代码能否提高一个层次,一 ...

  4. javascript基础系列(入门前须知)

    -----------------------小历史---------------------------- javascript与java是两种语言,他们的创作公司不同,JavaScript当时是借 ...

  5. JavaScript基础系列---闭包及其应用

    闭包(closure)是JavaScript中一个"神秘"的概念,许多人都对它难以理解,我也一直处于似懂非懂的状态,前几天深入了解了一下执行环境以及作用域链,可戳查看详情,而闭包与 ...

  6. 夯实JavaScript基础之prototype, __proto__, instanceof

    function New(f){return function(){var o = {'__proto__': f.prototype};f.apply(o, arguments);return o; ...

  7. JavaScript基础,Cookies,Sessions

    php和JavaScript,掌握JavaScript基础,自定义函数,流程控制语句,事件,调用JavaScript脚本,在PHP中使用JavaScript. JavaScript是网景公司开发的,是 ...

  8. JavaScript基础一

    1.1 javascript简介 Web前端有三层: HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用户体验) J ...

  9. Web前端-JavaScript基础教程上

    Web前端-JavaScript基础教程 将放入菜单栏中,便于阅读! JavaScript是web前端开发的编程语言,大多数网站都使用到了JavaScript,所以我们要进行学习,JavaScript ...

  10. JavaScript基础---语言基础(1)

    写在前面: 通过四篇博客把JS基础中的基础整理一下,方便自己查阅,这些内容对于实际项目开发中也许并不会在意,但是作为JS的语言基础,自觉还是应该熟悉.在完成这三篇博客(JavaScript基础---语 ...

最新文章

  1. mysql创建函数1418_Mysql中创建函数报“ERROR 1418 ”的解决方法
  2. eureka服务下线事件监听(自定义处理逻辑)
  3. keras从入门到放弃(九) 处理过拟合
  4. aver函数C语言怎么用,C语言函数使用
  5. 如何鉴别项目经理/软件设计师的水平
  6. 计算机的excel的知识,计算机基础知识:Excel常用操作(一)
  7. 计算机考研408复试题汇总
  8. Visual Studio使用教程
  9. 一个不错的控件网站-慧都控件网
  10. 一款实用工具:免费短信验证码SDK
  11. vant-uploader上传照片无法删除
  12. 软件验证计划简化版模板
  13. 微信公众号图灵机器人开发php,使用图灵机器人api搭建微信聊天机器人php实现,图灵微信聊天机器人...
  14. 阿里的黄金时代|一点财经
  15. 在App Store和Google Play上推广应用程序
  16. matlab绘制风场图(矢量图、箭头图)
  17. 未来营销闯关标配:大数据+智能硬件
  18. 颜色科学与计算机测配色 百度云,2004_01颜色科学与计算机测色配色实用技术_11196950.pdf...
  19. w3cshool 2013年最新离线手册 完整版
  20. 银隆新能源:涉嫌诈骗财政资金过亿,孙国华等人被刑拘

热门文章

  1. oracle的脚本语言是什么意思,Oracle中的sql脚本语言中的循环语句介绍
  2. Java工厂构造函数参数,javascript 面向对象之构造函数、工厂方式、字面量
  3. php 5.5.38 ldap安装,centos5.5系统下面,lnmp环境下面php加载ldap扩展
  4. mysql5.7解压版错误_mysql 5.7 解压版 安装net start mysql 发生系统错误 2
  5. oracle trace 文件名,限制oracle trace 文件大小
  6. sh.k7p.work/index.php,Laowang's Blogs
  7. Java内存模型常见问题
  8. UNIX(多线程):25---当前进程的线程哪些数据共享哪些是私有的
  9. 《Java8实战》笔记(02):通过行为参数传递代码
  10. python语句分为_python以什么划分语句块