xml地图|网站地图|网站标签 [设为首页] [加入收藏]
创建对象的七种方式,作用域链与闭包
分类:web前端

前端基础进阶(六):在chrome开发者工具中观察函数调用栈、作用域链与闭包

2017/02/26 · CSS, 基础技术 · 1 评论 · Chrome, 作用域链, 函数调用栈, 闭包

原文出处: 波同学   

图片 1

配图与本文无关

在前端开发中,有一个非常重要的技能,叫做断点调试

在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量对象,闭包,this等关键信息的变化。因此,断点调试对于快速定位代码错误,快速了解代码的执行过程有着非常重要的作用,这也是我们前端开发者必不可少的一个高级技能。

当然如果你对JavaScript的这些基础概念[执行上下文,变量对象,闭包,this等]了解还不够的话,想要透彻掌握断点调试可能会有一些困难。但是好在在前面几篇文章,我都对这些概念进行了详细的概述,因此要掌握这个技能,对大家来说,应该是比较轻松的。

为了帮助大家对于this与闭包有更好的了解,也因为上一篇文章里对闭包的定义有一点偏差,因此这篇文章里我就以闭包有关的例子来进行断点调试的学习,以便大家及时纠正。在这里认个错,误导大家了,求轻喷 ~ ~

前端工程师面试题汇总

2016/06/24 · 前端职场 · 3 评论 · CSS, HTML5, Javascript

原文出处: @markyun   

JavaScript 创建对象的七种方式

2017/06/20 · JavaScript · 对象

原文出处: Xuthus Blog   

JavaScript创建对象的方式有很多,通过Object构造函数或对象字面量的方式也可以创建单个对象,显然这两种方式会产生大量的重复代码,并不适合量产。接下来介绍七种非常经典的创建对象的方式,他们也各有优缺点。

图片 2

一、基础概念回顾

函数在被调用执行时,会创建一个当前函数的执行上下文。在该执行上下文的创建阶段,变量对象、作用域链、闭包、this指向会分别被确定。而一个JavaScript程序中一般来说会有多个函数,JavaScript引擎使用函数调用栈来管理这些函数的调用顺序。函数调用栈的调用顺序与栈数据结构一致。

目录

  1. HTML部分
  2. CSS部分
  3. JavaScript部分
  4. 其他问题

工厂模式

function createPerson(name, job) { var o = new Object() o.name = name o.job = job o.sayName = function() { console.log(this.name) } return o } var person1 = createPerson('Jiang', 'student') var person2 = createPerson('X', 'Doctor')

1
2
3
4
5
6
7
8
9
10
11
function createPerson(name, job) {
  var o = new Object()
  o.name = name
  o.job = job
  o.sayName = function() {
    console.log(this.name)
  }
  return o
}
var person1 = createPerson('Jiang', 'student')
var person2 = createPerson('X', 'Doctor')

可以无数次调用这个工厂函数,每次都会返回一个包含两个属性和一个方法的对象

工厂模式虽然解决了创建多个相似对象的问题,但是没有解决对象识别问题,即不能知道一个对象的类型

二、认识断点调试工具

在尽量新版本的chrome浏览器中(不确定你用的老版本与我的一致),调出chrome浏览器的开发者工具。

浏览器右上角竖着的三点 -> 更多工具 -> 开发者工具 -> Sources

1
浏览器右上角竖着的三点 -> 更多工具 -> 开发者工具 -> Sources

界面如图。

图片 3

断点调试界面

在我的demo中,我把代码放在app.js中,在index.html中引入。我们暂时只需要关注截图中红色箭头的地方。在最左侧上方,有一排图标。我们可以通过使用他们来控制函数的执行顺序。从左到右他们依次是:

  • resume/pause script execution
    恢复/暂停脚本执行
  • step over next function call
    跨过,实际表现是不遇到函数时,执行下一步。遇到函数时,不进入函数直接执行下一步。
  • step into next function call
    跨入,实际表现是不遇到函数时,执行下一步。遇到到函数时,进入函数执行上下文。
  • step out of current function
    跳出当前函数
  • deactivate breakpoints
    停用断点
  • don‘t pause on exceptions
    不暂停异常捕获

其中跨过,跨入,跳出是我使用最多的三个操作。

上图左侧第二个红色箭头指向的是函数调用栈(call Stack),这里会显示代码执行过程中,调用栈的变化。

左侧第三个红色箭头指向的是作用域链(Scope),这里会显示当前函数的作用域链。其中Local表示当前的局部变量对象,Closure表示当前作用域链中的闭包。借助此处的作用域链展示,我们可以很直观的判断出一个例子中,到底谁是闭包,对于闭包的深入了解具有非常重要的帮助作用。

HTML

  • Doctype作用?严格模式与混杂模式如何区分?它们有何意义?
  • HTML5 为什么只需要写 <!DOCTYPE HTML>?
  • 行内元素有哪些?块级元素有哪些? 空(void)元素有那些?
  • 页面导入样式时,使用link和@import有什么区别?
  • 介绍一下你对浏览器内核的理解?
  • 常见的浏览器内核有哪些?
  • html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?
  • 简述一下你对HTML语义化的理解?
  • HTML5的离线储存怎么使用,工作原理能不能解释一下?
  • 浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢?
  • 请描述一下 cookies,sessionStorage 和 localStorage 的区别?
  • iframe有那些缺点?
  • Label的作用是什么?是怎么用的?(加 for 或 包裹)
  • HTML5的form如何关闭自动完成功能?
  • 如何实现浏览器内多个标签页之间的通信? (阿里)
  • webSocket如何兼容低浏览器?(阿里)
  • 页面可见性(Page Visibility)API 可以有哪些用途?
  • 如何在页面上实现一个圆形的可点击区域?
  • 实现不使用 border 画出1px高的线,在不同浏览器的Quirksmode和CSSCompat模式下都能保持同一效果。
  • 网页验证码是干嘛的,是为了解决什么安全问题?
  • tite与h1的区别、b与strong的区别、i与em的区别?

构造函数模式

function Person(name, job) { this.name = name this.job = job this.sayName = function() { console.log(this.name) } } var person1 = new Person('Jiang', 'student') var person2 = new Person('X', 'Doctor')

1
2
3
4
5
6
7
8
9
function Person(name, job) {
  this.name = name
  this.job = job
  this.sayName = function() {
    console.log(this.name)
  }
}
var person1 = new Person('Jiang', 'student')
var person2 = new Person('X', 'Doctor')

没有显示的创建对象,使用new来调用这个构造函数,使用new后会自动执行如下操作

  • 创建一个新对象
  • 这个新对象会被执行[[prototype]]链接
  • 这个新对象会绑定到函数调用的this
  • 返回这个对象

使用这个方式创建对象可以检测对象类型

person1 instanceof Object // true person1 instanceof Person //true

1
2
person1 instanceof Object // true
person1 instanceof Person //true

但是使用构造函数创建对象,每个方法都要在每个实例上重新创建一次

本文由澳门新葡亰手机版发布于web前端,转载请注明出处:创建对象的七种方式,作用域链与闭包

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文