javascript数据结构和算法 第一章(编程体验)三

变量作用域

变量作用域就是指在一个程序中,变量的值在哪里可以被获取到.javascript函数作用域被定义为函数作用域,这意味着变量的值在定义和声明该变量的函数,包括任何在该函数的嵌套函数里是可见的.

当一个变量定义在函数的外面,在主程序中,该变量将会拥有全局作用域.这就意味着它的值可以被程序的任何地方,包括函数获取.

下面的小程序演示全局变量时如何工作的.

function showScope() {

return scope;

}

var scope = "global";

print(scope); // 打印 "global"

print(showScope()); // 打印 "global"

函数showScope() 可以获取到变量scope,因为scope 是一个全局变量.

全局变量可以在程序的任何地方被定义.无论是在函数定义之前或者之后.

现在,让我们来看看当我们在函数scope中定义了另外一个scope变量时发生了什么.

function showScope() {

var scope = "local";

return scope;

}

var scope = "global";

print(scope); // 打印 "global"

print(showScope()); // 打印 "local"

在showScope函数中定义的变量scope拥有本地作用域.而在主程序中定义的scope具有全局作用域.即使它们的名字是相同的,但是它们的作用域是不同的,当在它们定义的区域获取它们的值也是不相同的.

所有这些行为都是正常并且是期望的.然而,如果你在变量定义的时候省略了关键字var,所有这些都将会改变.

javascript允许你不使用关键字var来定义变量,如果你这样做的话,这个变量将会自动拥有全局作用域,即使它是定义在函数中.

例子1-11 演示不使用关键字var定义变量带来的后果.

例子1-11 过度使用全局变量的结果.

function showScope() {

scope = "local";

return scope;

}

scope = "global";

print(scope); // 打印 "global"

print(showScope()); // 打印 "local"

print(scope); // 打印 "local"

在例子1-11中,因为在函数中的scope变量没有使用关键字var,当字符串”local”被指派给该变量,事实上我们改变了在主程序的中变量scope.你应该在每次定义变量的时候使用var关键字来避免这样的事情发生.

在之前,我们提到了javascript有函数作用域.这意味着javascript没有块作用域,不像其他现代编程语言,在有块作用域的情况下,你可以在一个块中声明一个变量,并且这个变量不会被块以外所访问.典型的如C++或者java的for循环.

for(int i=1; i<=10;++1){

count<<”hello world”<<endl;

}

即使javascript没有块作用域,当我们写for循环的时候,我们假设它确实有.

for(var i=1 ; i <=10; ++i){

print(“hello world”);

}

我们可不想让你染上写垃圾代码的坏习惯.

递归

在javascript中,函数调用可以递归的被调用..在之前定义的函数factorial()函数可以被写成递归形式的.

function factorial(number) {

if (number == 1) {

return number;

}else {

return number * factorial(number-1);

}

}

print(factorial(5));

当一个函数被递归的调用的时候,当递归正在继续的时候,计算的结果将会暂时被挂起(yield).为了说明它是如何工作的,这里有个图显示了当传递给factorial()参数5的时候如何工作

5 * factorial(4)

5 * 4 * factorial(3)

5 * 4 * 3 * factorial(2)

5 * 4 * 3 * 2 * factorial(1)

5 * 4 * 3 * 2 * 1

5 * 4 * 3 * 2

5 * 4 * 6

5 * 24

120

在本书中我们讨论的好几个算法都是使用递归,大多数情况下,javascript可以解决相当深的递归调用.(上面的是相对比较浅的递归调用.),但是在某些情况下,算法需要更深的递归以至于javascript无法解决的的时候,我们可以试试迭代算法.

你应该始终记住一点:任何使用递归的函数可以被迭代方式来进行重写.

对象和基于对象编程

在这本书中讨论的数据结构都是通过对象来实现的.javascript提供了许多创建和使用对象的方法.在这个模块,我们演示在这本书中使用的 创建对象和使用对象函数,属性的技巧.

对象通过定义一个声明对象属性和方法的构造函数,接着是函数的定义.下面是检验账号对象的构造函数.

function Checking(amount) {

this.balance = amount; // property

this.deposit = deposit; // function

this.withdraw = withdraw; // function

this.toString = toString; // function

}

this 关键字被用来将每个方法和属性连接到对象实例中,现在我们来看看函数定义.

我们需要再一次使用this关键字 来修改balance 属性以便于让解释器知道我们引用的是哪个对象的balance属性.

例子1-12 提供了完整的账号检查对象的定义,同时包括一个测试程序.

function Checking(amount) {

this.balance = amount;

this.deposit = deposit;

this.withdraw = withdraw;

this.toString = toString;

}

function deposit(amount) {

this.balance += amount;

}

function withdraw(amount) {

if (amount <= this.balance) {

this.balance -= amount;

}

if (amount > this.balance) {

print("Insufficient funds");

}

}

function toString() {

return "Balance: " + this.balance;

}

var account = new Checking(500);

account.deposit(1000);

print(account.toString()); // Balance: 1500

account.withdraw(750);

print(account.toString()); // Balance: 750

account.withdraw(800); // displays "Insufficient funds"

print(account.toString()); // Balance: 750

总结

这一章,我们预览了我们在整本书中使用javascript的方式.

我们尝试着遵循程序员熟悉的C风格(C++和java)的编程风格.当然,javascript有很多不遵循那些语言的约定.我们理所应当的将其指出并且展示了正确使用该语言的方法.我们同样尽可能的遵循了很多由其他作者指出的好的javascript编程体验.作为一个负责人的程序员,我们必须始终记住一点:我们的代码能被机器执行和被其他程序员看懂同样重要!

javascript数据结构和算法 第一章(编程体验)三

时间: 2024-08-25 02:58:11

javascript数据结构和算法 第一章(编程体验)三的相关文章

javascript数据结构和算法 第一章(编程体验)一

声明和初始化变量 Javascript变量默认是全局作用域的.严格来说,使用之前是不需要定义的. 当一个javascript变量在没有被声明之前直接进行初始化,它就是一个全局变量.在这本书中,我们沿用编译语言如c++和java的编程约定.在使用变量之前都进行声明. 这还有一个附带的好处,声明的变量可以作为本地变量. 我们将会在本章节的后面讨论更多关于变量的作用域. 声明javascript变量,使用关键字var 变量名称.可选择的,可以带上赋值表达式. 下面是一些例子 var number; v

javascript数据结构和算法 第一章(Javascript编程环境和模型) 一

这一章介绍了我们在这本书中使用的描述各种数据结构和算法的Javascript的编程环境和编程架构. Javascript 环境 Javascript 在很长一段时间都是被作为web浏览器内置脚本编程语言来使用. 然而,在过去几年里,javascript编程环境得到了极大的发展,他们可以使javascript在桌面或者服务端运行. 在我们这本书中,我们使用其中的一个javascript环境:javascript shell:是Mozilla公司的javascript环境,被称为SpiderMonk

重读《学习JavaScript数据结构与算法-第三版》-第2章 ES和TS

定场诗 八月中秋白露,路上行人凄凉: 小桥流水桂花香,日夜千思万想. 心中不得宁静,清早览罢文章, 十年寒苦在书房,方显才高志广. 前言 洛伊安妮·格罗纳女士所著的<学习JavaScript数据结构与算法>第三版于2019年的5月份再次刊印发行,新版内容契合当下,实为JavaScript开发人员的必备之佳作.有幸重读此版,与诸君分享共勉. 内容提要 此章节为第2章-ECMAScript与TypeScript概述,主要介绍了JS和TS的相关概念,以及在JS新版本中的新特性:let.解构.箭头函数

重读《学习JavaScript数据结构与算法-第三版》- 第3章 数组(一)

定场诗 大将生来胆气豪,腰横秋水雁翎刀. 风吹鼍鼓山河动,电闪旌旗日月高. 天上麒麟原有种,穴中蝼蚁岂能逃. 太平待诏归来日,朕与先生解战袍. 此处应该有掌声... 前言 读<学习JavaScript数据结构与算法>- 第3章 数组,本节将为各位小伙伴分享数组的相关知识:概念.创建方式.常见方法以及ES6数组的新功能. 数组 数组是最简单的内存数据结构,用于存储一系列同一种数据类型的值. 注:虽然数组支持存储不同类型的值,但建议遵守最佳实践. 一.数组基础 创建和初始化数组 new Array

重读《学习JavaScript数据结构与算法-第三版》- 第6章 链表(一)

定场诗 伤情最是晚凉天,憔悴厮人不堪言: 邀酒摧肠三杯醉.寻香惊梦五更寒. 钗头凤斜卿有泪,荼蘼花了我无缘: 小楼寂寞新雨月.也难如钩也难圆. 前言 本章为重读<学习JavaScript数据结构与算法>的系列文章,该章节主要讲述数据结构-链表,以及实现链表的过程和原理. 链表 链表,为什么要有这种数据结构呢?当然,事出必有因! 数组-最常用.最方便的数据结构,But,当我们从数组的起点或中间插入或移动项的成本很高,因为我们需要移动数组元素. 链表,是存储有序的元素集合.链表中的元素在内存中并不

javascript数据结构和算法 一(本书组织结构)

环境 我们在本书中使用的Javascript编程环境是基于SpiderMonkey 引擎的javascript shell. 第一章讲述了在你的环境中下载 shell的介绍. 其他的shell例如Nodejs同样可以工作,虽然你可能需要简单的改变下代码. 除了shell,唯一你要准备的就是文本编辑器. 本书的组织结构 第一章:javascript语言的概览,至少是在本书中使用的javascript的一些特征.这一章同时展示了在整本书中使用的一些编程风格. 第二章:讨论了在计算机科学中最通用的数据

JavaScript学习指南之第一章Hello JavaScript!最基础的JavaScript入门

JavaScript学习指南笔记 第一章 Hello JavaScript! JavaScript简介 JavaScript属于网络端的脚本语言. JavaScript 被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies,以及更多的应用. 能够与网页进行完美的集成.. 目前在因特网领域,也是比较流行的一种脚本语言. JavaScript是一种轻量级的编程语言. JavaScript是可插入HTML页面的编程代码. JavaScript插入HTML页面后,可有所有的浏览器所执行

《大道至简》第一章——编程的精义_读后感(Java伪代码形式)

<大道至简>第一章——编程的精义_读后感(Java伪代码形式)1.愚公移山//愚公为团体的项目组织者.团体经理.编程人员.技术分析师等//子孙荷担者三人为三名技术人员//遗男为外协//目标为“毕力平险,指通豫南,达于汉阴”public class Ygys; //定义一个名为Ygys的类{String 人员;public static void main(String[] args)//定义主程序{人员初始化人员= new String();while(山没平){if(人员死){人员 = 愚公

算法入门《数据结构与算法图解》+《我的第一本算法书》+《学习JavaScript数据结构与算法第3版》

最近几年学前端的人会越来越多,再加上前端的范围越来越广,从前端发展为全栈,数据结构和算法的功底要求势必将越来越高. <数据结构与算法图解>电子书及代码是数据结构与算法的入门指南,不局限于某种特定语言,略过复杂的数学公式,用通俗易懂的方式针对编程初学者介绍数据结构与算法的基本概念,培养编程逻辑.主要内容包括:为什么要了解数据结构与算法,大O表示法及其代码优化利用,栈.队列等的合理使用,等等. <算法图解>电子书非常的体贴,看起来也很快,用图来解释算法是非常好的想法,可作为学习数据结构