通过使用Chrome的开发者工具来学习JavaScript

本文作者是Peter Rybin,Chrome开发者工具团队成员.

本文中,我们将通过使用Chrome的开发者工具,来学习JavaScript中的两个重要概念"闭包"和"内部属性".

闭包

首先要讲的是闭包(closure) – JavaScript中最有名的东西之一.一个闭包就是一个使用了外部变量的函数.查看下面的例子:

function A(a, b, c) {
  var ar = [a, b, c];
  return function B(i) {
    return ar[i];
  };
} 

var b = A('Here', 'I', 'am');
console.log( b(1) );

console.log( b(1) );

函数声明之后的第一条语句调用了函数A,函数A创建了一个值为数组[a,b,c]的局部变量ar,返回了一个函数B(存储在了变量b中),然后运行结束.

第二条语句调用了函数B(b),返回并打印出了数组ar.这就意味着A中的数组ar在A结束执行后仍然存在.但是它存储在什么地方呢?当然,在b上!但是究竟是存在b的哪里呢?某个属性中?不是的.精心开发5年的UI前端框架!

这是JavaScript语言的一个核心特性:一个函数可以持有外层作用域的变量,并且除了调用该函数以外没有任何其他方法可以访问到这些变量.

从现在开始,chrome的开发者工具可以让闭包中的外部变量现形.在监控表达式(Watch Expressions)面板中查看函数实例b,展开它的属性后,应该会有一个称为<function
scope>的
子节点.所有被绑定的闭包变量都能在这里看到,这些变量就是在函数调用时可能会被用到的变量.

内部属性

开发者工具还能显示出另外一个东西,叫做内部属性(internal property).

假设你的代码中有个变量s,而且还执行了下面这样的操作:

s.substring(1, 4)  // 返回'ell'

你觉得s肯定是个字符串值吗?
这可不一定
.它也有可能是个字符串包装对象.尝试下面的监控表达式:

"hello"
Object("hello")

第一个表达式是一个普通的字符串字面量,第二个是一个功能完整(full-featured)的对象.令人费解的是,这两个值几乎有完全相同的表现.但是第二个表达式才真正的拥有自己的属性,并且你也可以在它身上添加自定义的属性.展开它的所有属性你会看到,它不是一个完全常规的对象:它有一个内部属性[[PrimitiveValue]] ,被包装的字符串值就存储在这个属性里面.你不能在JavaScript代码中访问到这个内部属性,但是你能在开发者工具的中看到它.精心开发5年的UI前端框架!

还有哪些值拥有内部属性?那就是绑定函数(bound function).绑定函数也算是一种包装对象,只不过被包装的是个函数.尝试执行下面的两条语句:

function Sum(a, b) { return a + b; }
var inc = Sum.bind(null, 1); // 将形参a绑定为1,this绑定为null

如果你把Sum和inc放在监控表达式面板中对比一下,你会看到,它们都是函数,但inc是一个不透明(non-transparent
)的函数
:你看不到它的函数体内容,也不能看到它定义时的作用域.精心开发5年的UI前端框架!

这就是绑定函数的工作原理.在开发者工具中,你会看到[[TargetFunction]], [[BoundArgs]]以及[[BoundThis]]这三个内部属性.它们都表明了inc是一个绑定函数,以及一些更具体的信息:inc绑定的目标函数是Sum,绑定了一个参数1,绑定的this值是null.精心开发5年的UI前端框架!

时间: 2024-07-29 23:26:03

通过使用Chrome的开发者工具来学习JavaScript的相关文章

谷歌Chrome浏览器开发者工具的基础功能

上一篇我们学习了谷歌Chrome浏览器开发者工具的基础功能,下面介绍的是Chrome开发工具中最有用的面板Sources.Sources面板几乎是最常用到的Chrome功能面板,也是解决一般问题的主要功能面板.通常只要是开发遇到了js报错或者其他代码问题,在审视一遍代码而一无所获之后打开Sources进行js断点调试,几乎能解决8成的代码问题. js断点功能让人兴奋不已,以前只能在IE中靠alert弹出窗口调试js代码,那样的开发环境对于前端程序员来说简直是一场噩梦.本篇介绍Sources的具体

chrome F12_Network 开发者工具详解

本文为学习chrome F12_Network的一点记录,如有不妥之处请各位大神指点,谢谢! 开发者工具面板 最常用的前四个功能模块如下: Elements:查找网页源代码HTML中的任一元素,手动修改任一元素的属性和样式且能实时在浏览器里面得到反馈. Console:录开发者开发过程中的日志信息,且可以作为与JS进行交互的命令行Shell. Sources:断点调试JS. Network:从发起网页页面请求Request后分析HTTP请求后得到的各个请求资源信息(包括状态.资源类型.大小.所用

谷歌 chrome 浏览器开发者工具打不开的解决方法

很长一段时间没有用Chrome浏览器 最近打开,发现开发者工具怎么都打不开 在网上也没有找到方法 各种打开方式都试了依然是没有动静 但是在隐身模式下开发者工具是可以的打开的 重新安装后还是一样 实在没有找到方法 就在浏览器里各种尝试 最后我打开扩展程序里 里面勾选了开发者模式 我把取消后开发者工具就可以正常使用了 不知道有没有其他人遇到开发者工具打不开的问题 如果有的话可以尝试看下扩展程序内是否勾选了开发者模式 如是取消就可以正常使用了

Chrome的开发者工具

Chrome开发者工具已经强大到没朋友的地步,特别是其功能丰富界面友好的console,使用得当可以有如下功效: 更高「逼格」更快「开发调试」更强「进阶级的Frontender」 Bug无处遁形「Console大法好」 主要内容: 1.console.log 2.console.assert 3.console.count 4.console.dir 5.console.time & console.timeEnd 6.console.profile & console.timeLime

Chrome的开发者工具(Chrome Developer Tools)

按F12 https://developer.chrome.com/devtools/index http://www.w3school.com.cn/html/html_intro.asp http://www.cnblogs.com/QLeelulu/archive/2011/08/28/2156402.html http://wenku.baidu.com/link?url=fz5kfYH9wlEkqHpkPiP7b8Ws4uVQzQaFQEMzroP7jWj4NYq2vx1FLHUfX9

chrome浏览器 开发者工具简介

Chrome浏览器得益于其优秀的V8解释器,javascript执行速度和内存占有率表现非常优秀. 掌握了Chrome工具可提高学习效率和开发效率. 有如下功能面板,可以使用Ctrl+[和Ctrl+]快捷键在面板之间切换. 简单常用的就一笔带过 一.标签页 查看DOM tree内容 根据标签页的html内容找到对应元素 根据页面元素找到标签页的html 改变DOM内容 查看js动态生成的DOM 在标签页右侧查看style 查找 标签注册事件查看.[待扩展] 按钮绑定哪些功能,鼠标点击时执行了那个

Robot Framework 经验谈 - 撰写元素xpath表达式并且通过Chrome F12开发者工具进行验证

F12开发者工具有console标签,在其内执行console命令可以交互性验证css或者xpath表达式效果 xpath用$x(),将表达式用引号括起来放进去,回车执行命令,如果成功产生非空输出的匹配元素列表(可以点击自动框选定位.可以展开子元素查看),举例: $x("//table[@id='simpleWithNested']/tbody/tr/*") 对于引号内的部分,可以用count函数包裹起来,输出匹配元素列表的大小: 若用string替换count,则输出匹配元素列表所有

[Selenium] 在Chrome的开发者工具中验证检查XPath/CSS selectors

Evaluate and validate XPath/CSS selectors in Chrome Developer Tools Method 1 : From Elements panel Use the search function inside Elements panel to evaluate XPath/CSS selectors and highlight matching nodes in the DOM. 1.Press F12 to open up Chrome De

chrome 浏览器 开发者工具 性能检测 参数解释

Sending is time spent uploading the data/request to the server. It occurs between blocking and waiting. For example, if I post back an ASPX page this would indicate the amount of time it took to upload the request (including the values of the forms a