本书作者是jQuery之父John Resig的经典之作,是深入学习JavaScript技术的绝佳教材,涵盖了可重用代码、文档对象模型、Ajax、Web生产工具、AngularJs登内容。作者讲解了JS的发展现状、使用技巧以及未来趋势,辅以诸多代码提示,条理清楚、分析到位。本书展示了更新颖、更巧妙、更具有深度的JavaScript技术,同时理清了JavaScript的发展脉络,既能磨练技能,又可开拓视野。

第2章 特性、函数和对象

  对象是JavaScript的基本单元。本章包含了JavaScript语言中最为重要的一些方面,例如引用、作用域、闭包以及上下文。它们未必是建造这门语言的基石,却是支撑、改良JavaScript的优美拱梁。

2.1 语言特性

2.1.1 引用和值

  JavaScript采用两种方式来保存数据:值和引用。所有的原始值都直接复制到变量中。原始值包括字符串、数字、布尔值、null 和undefined。原始值最重要的特点是:它们按照值进行赋值、复制、传递函数参数以及返回函数结果。

  JavaScript的其余部分则依赖于引用。没有保存原始值的变量中保存的对象是对象的引用。引用是指对象(数组、日期或是其他)所在位置的指针。实际的对象被称为指称目标(referent)。这是一种存在于多种编程语言中的强大特性。他提高了操作效率:两个(或多个)变量不需要各自拥有某个对象的副本,他们只需要指向同一个对象即可。

  对象拥有两种特性:属性和方法。这两者通常杯统称为对象的成员。属性包含对象的数据。属性可以是原始值,也可以是对象。方法是作用在数据上的函数。在一些关于JavaScript的讨论中,方法被涵盖在属性之中。但有必要对两者做出区分。

2.1.2 作用域

  绝大多数编程语言都采用了某些形式的作用域,差别在于作用域的持续期(duration)。JavaScript中只有两种作用域:函数作用域和全局作用域。函数拥有自己的作用域,而块(如while、if和for语句)则没有。

例2-1 JavaScript中变量作用域的工作方式:

// 将全局变量foo的内容设置为test
var foo = 'test'// 在if块中
if (true) {// 将foo设置为new test// 注意:此时处于全局作用域!
  var foo = 'new test'
}//在这里我们看到foo此时等于new test
console.log( foo === 'new test' );//创建一个修改变量foo的函数
function test() {var foo = 'old test'
}// 但是在调用函数的时候,变量foo仅存在于函数作用域中
test();// foo仍然等于new test
console.log(foo)

  你会发现变量位于全局作用域中。在基于浏览器的JavaScript中,所有的全局变量实际上是作为window对象的属性存在的。在其他环境中,所有的全局变量属于某个全局上下文。在例2-1中,赋值给了处于test()函数作用域中的变量foo。但是在例2-1中,该变量并没有声明它的作用域(使用var foo),当变量foo没有明确声明作用域时,他会被定义成全局作用域,即使他只是打算在函数中使用。

例2-2 隐式全局变量声明:

// 定义函数,设置变量foo的值
function test() {foo = 'test';
}
// 调用函数为foo赋值
test();
// foo现在变成了全局作用域
console.log( window.foo === 'test' );

  函数中 不加var 声明的变量 是全局变量。

  在函数声明变量的时候,要留心变量提升(hoisting)的问题。函数中所有的声明(不包括变量的初始值)都会提升到作用域的顶部。JavaScript以此保证变量名全局可用。

2.1.3 上下文 

  你可以使用变量this来访问上下文,该变量总是指向代码当前所处的执行环境。

例2-3 在上下文中使用函数,然后将上下文切换到另一个变量:

function setFoo(fooInput) {this.foo = fooInput
}
var foo = 5;
console.log( 'foo at the window level is set to:' + foo );var obj = {foo: 10
}console.log( 'foo inside of obj is set to:' + obj.foo );// 修改window对象中的foo
setFoo(15);
console.log( 'foo at the window level is now set to:' + foo );// 修改对象obj中的foo
obj.setFoo = setFoo;
obj.setFoo(20)
console.log( 'foo inside of obj is now set to:' + obj.foo );
// foo at the window level is set to: 5
// foo inside of obj is set to: 10
// foo at the window level is now set to: 15
// foo inside of obj is now set to: 20

  setFoo函数看起来有点奇怪。我们通常并不会在普通的工具函数中使用this。将setFoo()与obj绑定在一起,利用this来访问obj的上下文。JavaScript有两种方法可以在制定的上下文中运行函数,call()和apply()方法。

例2-4 更改函数上下文:

   // 一个简单的函数,可以用来设置其上下文的文字颜色function changeColor(color) {this.style.color = color;}// 在window对象上调用函数时,该函数无法正常运行,原因在于window对象并不包含style对象// changeColor('while');// 创建一个新的div元素,该元素包含style对象var main = document.createElement('div');// call方法将div设置为黑色// call方法使用第一个参数来指定上下文,并将其余的参数传递给函数changeColor.call(main, 'black');// 使用console.log检查结果// 应该输出“blak”
  console.log(main.style.color);// 定义一个函数,用于设置body元素的文字颜色function setBodyColor() {// apply方法使用第一个参数将上下文设置为body元素,第二个参数是一个传递给函数的参数数组
    changeColor.apply(document.body, arguments);}// 将body元素的文字颜色设置成红色setBodyColor('red')

2.1.4 闭包

  闭包是这样一种手段:通过它,内部函数在其副函数结束之后依然能够引用其外围函数(outer enclosing function)中的变量。

  闭包允许你引用存在于父函数中的变量。但是它提供给你的并不是该变量在创建之时的值,而是其在父函数中最后的那个值。

例2-4:

转载于:https://www.cnblogs.com/liqi-0126/p/10373832.html

精通JavaScript(重点内容笔记)更新中...相关推荐

  1. 初学Oracle的笔记(2)——基础内容(实时更新中..)

    续 初学Oracle的笔记(1)--基础内容(实时更新中..) 1.oracle中创建一张表,写法与sql server中的一样. SQL> create table Course 2 ( cn ...

  2. JavaScript 个人总结(持续更新中)

    目录 文章目录 前言 一.javaScript是什么? 二.js引入方式 1.行内式 2.内嵌式 3.外链式 三.js的输出方式 四.js数据类型 1.基本数据类型: 1.数据类型的转换: 2.运算符 ...

  3. 学习必备软件:OneNote+Mindmaster完美结合(精彩内容持续更新中…….)

    一 为什么做笔记? 做笔记应该注意哪些方面? 1 为什么做笔记? 做笔记的意义体现在以下几个方面: (1)抵抗忘记 根据艾宾浩斯遗忘曲线,前一天记住的信息,第二天在记忆中只能留下约三分之一,而第三天会 ...

  4. JavaScript杂记(持续更新中)

    1. HTML 表单自动验证 HTML 表单验证也可以通过浏览器来自动完成. 如果表单字段 (fname) 的值为空, required 属性会阻止表单提交: <!DOCTYPE html> ...

  5. Java基础易忘重点内容笔记【附B站韩顺平老师课程链接】

    B站课程链接:https://www.bilibili.com/video/BV1fh411y7R8?spm_id_from=333.999.0.0 1. 文档注释 用于对Java方法的注释,可据此生 ...

  6. python甲鱼怎么修改,跟小甲鱼自学python笔记 更新中…

    看完这些笔记自己就可以入门Python了 在B站上看小甲鱼的视频,顺便整理一下自己的笔记. 第十课 列表 1.列表中可以存放一些什么东西? 在列表中可以存放整数.浮点数.字符串.对象-甲鱼粉说Pyth ...

  7. Android V7包学习笔记更新中.....

    关于V4 V7 V13 VX包介绍转自这里 1, Android Support V4, V7, V13是什么? 本质上就是三个java library. 2, 为什么要有support库? 如果在低 ...

  8. SQL手工注入入门级笔记(更新中)

    一.字符型注入 针对如下php代码进行注入: $sql="select user_name from users where name='$_GET['name']'"; 正常访问 ...

  9. javascript算法汇总(持续更新中)

    1. 线性查找 1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset ...

最新文章

  1. 你好AI丨重读图灵经典之作,九条反驳意见引人深思
  2. kafka系列九、kafka事务原理、事务API和使用场景
  3. .NET 基金会完成第一次全面改选
  4. 数据库面试题目经典大全
  5. P7581-「RdOI R2」路径权值【长链剖分,dp】
  6. 共享上网掉线后的排错
  7. 基于java题库及试卷管理模块的设计与开发(含源文件)
  8. Mac系统搭建C语言开发环境
  9. 两轮电动车高端VS中低端,雅迪、爱玛谁更靠近市场?
  10. 【01】制作第一个zblog模板第一期,第一步首先我们创建我们的模板基础信息以及申请成为zblog开发者
  11. 计算机主机mac地址怎么查,怎么查看电脑的Mac地址
  12. 定时任务实现方式对比
  13. YOUKU播放器 研究
  14. 小码哥java一期 百度云_小码哥IOS 十一期
  15. Android自定义控件(高手级)--JOJO同款能力分析图,这份字节跳动历年校招Android面试真题解析
  16. python实现克莱姆法则
  17. 如何查看DNS记录的生存时间(TTL)?
  18. 烤仔星选·币圈非著名正指 | DeFi安全篇:合约留后门,无脑授权有风险
  19. Mac IDEA 最常用快捷键
  20. python面向对象2

热门文章

  1. 由一行文本输入框引发的思考
  2. [Android]使用Kotlin开发Android(二)
  3. 转移操作主机角色至Windows Server 2012 R2
  4. 文件和目录之stat、fstat和lstat函数
  5. 安装zookeeper集群
  6. DataTable分页控件设计(适用于Gridview和Repeater)
  7. 服务器错误配置文件的xml格式,IIS配置文件的XML格式不正确
  8. pyaudio与优美的声音
  9. Python 3下Matplotlib画图中文显示乱码的解决方法
  10. 【java】在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException...