看图学习javascript

简介:

如果想成为一个高效的javascript的程序员,深刻理解javascript的语法是必须的。记得上小学的时候,再难的数学题通过画图的方式很快就能解决,我们在学习javascript有时感觉一些语法也比较难理解,为何不能用画图的方式帮助我们理解呢?下面我们就把javascript一些基本的语法转换成图行元素,估计您会有一个醍醐灌顶的感觉。这个系列文章我准备使用两篇文章写完,今天我们来看一些最基本的内容。

 

javascript中变量名(variable)就是一个简单的标记,来引用内存中的一个值,这些值可以是一些基本类型(strings, numbers, and booleans.),也有可能是一些引用类型(objects or functions

 

 

 

  • 局部变量

 

    在下面的例子中,我们在顶层作用域中来声明一些局部变量,他们指向的是一些基本类型的数值。

      /* 在顶层作用域来声明一些局部变量*/ var name = "Tim Caswell"; var age = 25; var isProgrammer = true; var likesJavaScript = true; // 如果两个变量指向相同的值,看看这两个变量是否相等。 isProgrammer === likesJavaScript; /* 结果:true */     

   

下面我们来用图形来表示上面的代码关系:
 
 
注意:两个boolean类型的变量在内存中指向相同的值,这是因为基本类型的数值是不可变的,这样javascript的解释器就可以让指向相同值的所有引用共享一个实例。 
因此isProgrammerlikesJavaScript===(绝对等于)进行比较的结果是true左边最外城的矩形表示最外层的闭包作用域,里面的变量表示顶层的局部标量,不要和global/window的属性混淆。

对象和原型链

先来看个简单的例子:这里需要用到一个工具方法:

if (typeof Object.create !== 'function') { Object.create = function (o) { function F() {} F.prototype = o; return new F(); }; } // Create a parent object var tim = { name: "Tim Caswell", age: 28, isProgrammer: true, likesJavaScript: true } // Create a child object var jack = Object.create(tim); // Override some properties locally jack.name = "Jack Caswell"; jack.age = 4; // Look up stuff through the prototype chain jack.likesJavaScript; /* => true */

下面我们来用图形来表示上面代码的关系:

 

通过上图我们可以一目了然的看到jack.likesJavaScript值是什么了。

  • 全局对象

曾经怀疑想jslint这样的工具怎么会提示不要在声明变量的时候忘记var,如果忘记了会发生什么呢?

var name = "Tim Caswell"; var age = 28; var isProgrammer = true; // Oops we forgot a var likesJavaScript = true;

 

全局对象

注意:likesJavaScript是全局对象的一个属性,而不是一个最外层闭包的一个自由变量。这样做一般情况下没有问题,当你混淆多个javascript的时候就会有问题了。

因此当你声明变量的时候使用var关键字,可以让你的变量在当前的作用域或者子作用域中;如果你真的想声明全局对象的属性,在浏览器中用window.myVariable, node.jsglobal.myVariable

 

 

  • 函数和闭包

 

 

Javascript不仅仅是一系列链表的数据结构。他还包含可以执行和调用的函数,这些函数生成了作用域链和闭包。

 

显式的闭包

 

方法可以被认为是含有可执行代码和一些属性的特殊对象,每一个函数有一个scope属性表示它定义时所在的环境,如果一个函数是从两外一个函数放回的,那么他对原来环境的引用会被新的函数封闭在闭包中。

下面的代码,我们声明一个函数然后让他产生一个闭包并且返回一个函数。

 

function makeClosure(name) { return function () { return name; }; } var description1 = makeClosure("Cloe the Closure"); var description2 = makeClosure("Albert the Awesome"); console.log(description1()); console.log(description2()); /* Cloe the Closure Albert the Awesome */

 

显式的闭包

 

当我们调用description1()的时候,解释器首先查询到description1引用的函数,
然后执行它,该函数需要一个名字为name的局部变量,然后他在闭包中找到了这个变量。makeClosure所生成的方法的局部变量都有自己单独的一份空间。
  • 共享方法和this
Javascript提供了this关键字允许我们根据不同的调用对象在不同的作用域中重用同一个函数。如:
var Lane = {
  name: "Lane the Lambda",
  description: function () {
    return this.name;
  }
};
var description = Lane.description;
var Fred = {
  description: Lane.description,
  name: "Fred the Functor"
};
// Call the function from four different scopes
console.log(Lane.description());
console.log(Fred.description());
console.log(description());
console.log(description.call({
  name: "Zed the Zetabyte"
}));
/*
Lane the Lambda 
Fred the Functor 
undefined 
Zed the Zetabyte
*/
从图中我们可以看到description确实指向同一个函数,但是name的指向是不相同的。
最后我希望用图形的方式能够让大家更好的理解javascript,祝大家学习愉快,有什么问题,请留言反馈。

 

 

 

目录
相关文章
|
2月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
27 0
|
2月前
|
消息中间件 Web App开发 JavaScript
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
Node.js【简介、安装、运行 Node.js 脚本、事件循环、ES6 作业队列、Buffer(缓冲区)、Stream(流)】(一)-全面详解(学习总结---从入门到深化)
70 0
|
4天前
|
JavaScript 前端开发 应用服务中间件
node.js之第一天学习
node.js之第一天学习
|
1月前
|
运维 JavaScript 前端开发
发现了一款宝藏学习项目,包含了Web全栈的知识体系,JS、Vue、React知识就靠它了!
发现了一款宝藏学习项目,包含了Web全栈的知识体系,JS、Vue、React知识就靠它了!
|
1月前
|
JavaScript
Vue.js学习详细课程系列--共32节(4 / 6)
Vue.js学习详细课程系列--共32节(4 / 6)
33 0
|
1月前
|
前端开发 搜索推荐 JavaScript
编程笔记 html5&css&js 001 学习编程从网页开始
编程笔记 html5&css&js 001 学习编程从网页开始
|
2月前
|
前端开发 JavaScript
从零开始学习前端开发:HTML、CSS、JavaScript入门指南
【2月更文挑战第1天】本文将带领读者从零开始学习前端开发,介绍HTML、CSS和JavaScript的基础知识与应用,帮助读者快速入门前端开发领域。
64 1
|
2月前
|
数据采集 机器学习/深度学习 JavaScript
画【Python折线图】的一百个学习报告(二、pyecharts引入js文件)
画【Python折线图】的一百个学习报告(二、pyecharts引入js文件)
51 0
|
2月前
|
JSON 前端开发 JavaScript
Webpack【Webpack图片处理、Webpack中proxy代理 、自动清理dist、Webpack优化、JavaScript中的代码检查】(三)-全面详解(学习总结---从入门到深化)
Webpack【Webpack图片处理、Webpack中proxy代理 、自动清理dist、Webpack优化、JavaScript中的代码检查】(三)-全面详解(学习总结---从入门到深化)
35 0
Webpack【Webpack图片处理、Webpack中proxy代理 、自动清理dist、Webpack优化、JavaScript中的代码检查】(三)-全面详解(学习总结---从入门到深化)
|
2月前
|
资源调度 JavaScript 关系型数据库
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)
33 0