1、全局变量与局部变量

全局变量:全局变量就是在函数的外部定义的一个在其他地方都可以调用的变量

局部变量:局部变量是相对于全局变量而言的,局部变量指的是在一个区域内存在这个变量

全局变量的创建原理是在JavaScript加载页面的时候会自动的创建一个window对象,这个对象我们可以在方法的外部通过this去调用,我们所定义的变量其实就是对这个window对象进行添加属性而已

myglobal = "hello"; // 不推荐写法
console.log(myglobal); // "hello"
console.log(window.myglobal); // "hello"
console.log(window["myglobal"]); // "hello"
console.log(this.myglobal); // "hello"

好了说一下,相信大家都知道全局变量的好处吧,全局变量就是的一个好处就是可以避免多次使用的变量被重复的定义(相对于局部变量而言)

局部变量的好处是当web页面需要引入广告代码或者等其他的第三方的代码的时候,通过创建局部变量就可以避免与第三方代码发生冲突,创建局部变量只要在方法内响应的变量加上var就行了,说到这里我就来挖一个坑给大家填填

(function foo(){
var a=b=1;
}());
console.log(b);
console.log(a);

大家先不要打开调试工具,先猜一猜运行的结果是什么?好了不管你猜对还是猜错我在这里就公布答案了

原因是我们应该要把var a=b=1;这就一分为二其中b是全局变量,a是局部变量但是他们的值是相同的,但是在方法的外部是不能访问到局部变量,所以才会出现a未定义的提示

 

2、使用var创建的全局变量和隐式创建全局变量的区别?

使用var创建的全局变量可以不可以通过delete删除

隐式创建全局变量可以通过delete删除

从侧面我们可以说明通过隐式创建全局变量不是在全局对象中创建变量,而是在全局对象创建属性(也就是说在window对象上创建属性)

        var myglobal = "hello";
myglobal1="hello1";
function foo(){
myglobal2="hello2";
}
//删除
delete myglobal;
delete myglobal1;
delete myglobal2;
//调试一下,看看结果

结果如下:

3、单var定义变量

function func() {
var a = 1,
b = 2,
sum = a + b,
myobject = {},
i,
j;
// function body...
}
//查看单var结果
console.log(myobject);
console.log(i);

这样定义的变量全部都是局部变量,而且还有还有在单一地方寻找所有的局部变量、减少代码等好处

4、var的悬置问题

JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析)

这个定义可能有些云里雾里,我们就来写一个演示看看理解理解

myglobal="leslie";
function foo(){
console.log(myglobal);//undefined
var myglobal="les";
console.log(myglobal);//les
}
foo();

运行的结果如注释所注,可能有些朋友会有所疑惑,其实这个就是一个var悬置的问题,在foo方法中我们创建了另外的一个局部变量myglobal,这个局部变量就会虽然看起来没有置顶,但是实际上在运行的过程中会将这个局部变量置顶,由于新创建的变量表现为undefined,所以这个时候第一句打印出来的值就是undefined,运行代码如下:

myglobal="leslie";
function foo(){
var myglobal;//undefined
console.log(myglobal);//undefined
var myglobal="les";
console.log(myglobal);//les
}
foo();

5、为对象模型添加方法以及遍历去除原始模型的方法

1、创建一个对象模型

// 对象
var man = {
hands: 2,
legs: 2,
heads: 1
};

2、为对象添加方法

// 对象
var man = {
hands: 2,
legs: 2,
heads: 1
}; // 在代码的某个地方
// 一个方法添加给了所有对象
if (typeof Object.prototype.clone === "undefined") {
Object.prototype.clone = function () {};
}

3、过滤对象模型的方法

// 1.
// for-in 循环
for (var i in man) {
if (man.hasOwnProperty(i)) { // 过滤
console.log(i, ":", man[i]);
}
}
/* 控制台显示结果
hands : 2
legs : 2
heads : 1
*/

虽然可以为对象模型添加属性或者是方法,但是这个一般我们是不推荐使用的, 因为这样会造成团队沟通障碍以及其他的问题

6、避免发生隐式转换

JavaScript在比较的时候会发生隐式转换,为了避免发生隐式转换我们应该使用"==="和“!==”来代替"=="和“!=”

var test=1;
if(test===true){
alert("this is one test");
}
if (test==true) {
alert("this is two test");
};

结果:

7、慎重使用eval()

在使用eval来动态加载脚本的时候,由于安全问题以及eval会污染环境

var un="test";
console.log(typeof un);//string
console.log(typeof deux); // "undefined"
console.log(typeof trois); // "undefined" var jsstring = "var un = 5; console.log(un);";
eval(jsstring); // un=5; jsstring = "var deux = 2; console.log(deux);";
new Function(jsstring)(); // deux=2; jsstring = "var trois = 3; console.log(trois);";
(function () {
eval(jsstring);
}()); // trois=3 console.log(typeof un); // number
console.log(un);
console.log(typeof deux); // "undefined"
console.log(typeof trois); // "undefined"

从上面的代码我们可以分析得出直接使用eval会污染原来的环境(将un原来的string修改为number),较为推荐的是使用第三种方法,即解决了这个问题同时还比较符合编程的代码习惯

上面其实是实现对方法外部的eval的隔离,其实在方法中我们也可以使用相同的方法来达到隔离的作用

(function () {
jsstring = "var trois = 3; console.log(trois);";
(function () {
jsstring="var trois=10;console.log(trois);";
eval(jsstring);
}());
console.log(jsstring);
}());

打印的结果是

除了使用两种相同的方法套接外,还可以使用new function(){}的这种方法的套接

其实说白了就是通过将eval放置在一个局部的作用域中运行,其实还有一种更加简便的方法可以实现(这是我自己想出来的方法,不对的地方请大家指正)

(function () {
jsstring = "var trois = 3; console.log(trois);";
{
jsstring="var trois=10;console.log(trois);";
eval(jsstring);
}
console.log(jsstring);
}());

这样运行的结果也是同上一个实例一样

8、编写规范

除了要注意这些问题编写规范也是很重要的

对于构造函数,可以使用大驼峰式命名法(upper camel case),如MyConstructor()。对于函数和方法名称,你可以使用小驼峰式命名法(lower camel case),像是myFunction(), calculateArea()getFirstName()。常量的命名我们一般用大写,例如:var MAX=1

深入学习JavaScript(一)的更多相关文章

  1. 一步步学习javascript基础篇(0):开篇索引

    索引: 一步步学习javascript基础篇(1):基本概念 一步步学习javascript基础篇(2):作用域和作用域链 一步步学习javascript基础篇(3):Object.Function等 ...

  2. 一步步学习javascript基础篇(8):细说事件

    终于学到事件了,不知道为何听到“事件”就有一种莫名的兴奋.可能是之前的那些知识点过于枯燥无味吧,说起事件感觉顿时高大上了.今天我们就来好好分析下这个高大上的东西. 可以说,如果没有事件我们的页面就只能 ...

  3. 一步步学习javascript基础篇(7):BOM和DOM

    一.什么是BOM.什么是DOM BOM即浏览器对象模型,主要用了访问一些和网页无关的浏览器功能.如:window.location.navigator.screen.history等对象. DOM即文 ...

  4. 学习javascript数据结构(三)——集合

    前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者 ...

  5. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  6. 学习javascript数据结构(一)——栈和队列

    前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...

  7. 《如何正确学习JavaScript》读后小结

    在segmentfault上读的一篇学习JavaScript路线的文章,做个小结. 一.简介.数据类型.表达式和操作符 (1)<JavaScript权威指南>前言1-2章&< ...

  8. 一步步学习javascript基础篇(6):函数表达式之【闭包】

    回顾前面介绍过的三种定义函数方式 1. function sum (num1, num2) { return num1 + num2; }  //函数声明语法定义 2. var sum = funct ...

  9. 一步步学习javascript基础篇(5):面向对象设计之对象继承(原型链继承)

    上一篇介绍了对象创建的几种基本方式,今天我们看分析下对象的继承. 一.原型链继承 1.通过设置prototype指向“父类”的实例来实现继承. function Obj1() { this.name1 ...

  10. 一步步学习javascript基础篇(4):面向对象设计之创建对象(工厂、原型和构造函数等模式)

    前面我们介绍了可以通过Object构造函数或对象字面量都可以用来创建单个对象,但是如果需要创建多个对象的话,显然很多冗余代码. 接下来介绍几种模式来创建对象.不过在此之前,我们还是先来了解下 type ...

随机推荐

  1. nginx 配置wordpress固定链接(自定义)

    今天在wordpress 下配置文章固定链接的时候,遇到了404的错误.我首先在wordpress下的设置里的“固定链接”配置页面,自定义链接的结构 “http://www.haozi8.com/%p ...

  2. nginx看端口使用情况

    [root@iZ94j7ahvuvZ sbin]# netstat -apn Active Internet connections (servers and established) Proto R ...

  3. 免费的无次数限制的各类API接口(2)

    之前整理过一些聚合数据上的免费API(各类免费的API接口分享,无限次),这次还有一些其他的进行了整理,主要是聚合数据上和API Store上的一些,还有一些其他的. 聚合数据提供30大类,160种以 ...

  4. [书目20160218]微软软件研发的奥秘:MSF精髓

    目录 第一部分 解决方案交付基础 第1章 什么是MSF,它适合你吗 2 1.1 MSF的历史和起源 2 1.2 为什么是“框架” 3 1.3 MSF有何不同 5 1.4 MSF第四版的要素 5 1.5 ...

  5. 【OpenCV】opencv3.0中的SVM训练 mnist 手写字体识别

    前言: SVM(支持向量机)一种训练分类器的学习方法 mnist 是一个手写字体图像数据库,训练样本有60000个,测试样本有10000个 LibSVM 一个常用的SVM框架 OpenCV3.0 中的 ...

  6. java读取word内容

    暂时只写读取word内容的方法. 依赖的jar: poi-3.9-20121203.jarpoi-ooxml-3.9-20121203.jarxmlbeans-2.3.0.jar package co ...

  7. Zbrush遮罩边界该怎么实现羽化和锐化

    很多情况下为了雕刻制图需要,在ZBrush®中不仅要使用边缘清晰的遮罩,有时还要将遮罩边缘变得模糊,做羽化效果.那么如何在ZBrush中实现羽化遮罩效果或锐化遮罩效果,本文将做详细讲解. 若有疑问可直 ...

  8. 初始化 Ubuntu Trusty 14.04

    1. 软件源 sudo vim /etc/apt/source.list # 将软件源改为 sohu 的 deb http://mirrors.sohu.com/ubuntu/ trusty main ...

  9. JavaWeb学习----JSP简介及入门(含Eclipse for Java EE及Tomcat的配置)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  10. [cb]NGUI组件基类之 UIWidget

    UIWidget NGUI的UIWidget是所有组件的基类,它承担了存储显示内容,颜色调配,显示深度,显示位置,显示大小,显示角度,显示的多边形形状,归属哪个UIPanel.这就是UIWidget所 ...