规避冲突

function foo(){

function bar(a){

i = 3;

console.log(a + i);

}

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

bar(i * 2)

}

}

// 11无限死循环

区分函数声明和函数表达式最简单的方法是看 function 关键字出现的位置,如果function是声明中的第一个词,那么是函数声明,否则是函数表达式。

(function foo(){})() 立即执行的函数表达式

IIFE 立即执行函数表达式

var a = 2;

(function IIFE(global){

var a = 3;

console.log(a); // 3

console.log(global.a) // 2

})(window)

console.log( a)  // 2

将window 对象的引用传递进去,当然可以从外部作用域传入进任何你需要的东西,

并可以将变量命名为任何你觉得合适名字。

var a = 2;

(function IIFE(def) {

def(window)

})(function def(global) {

var a = 3;

console.log(a); // 3

    console.log(global.a) //2

});

函数表达式def 定义在片段的第二部分,然后当做参数被传递进IIFE 函数定义的第一部分中。最后def也就是传递进去的函数被调用,并将window 传入当做global参数的值。

try/catch 的catch 分句会创建一个块级 作用域,其中声明的变量仅在catch内部有效

例如:try{

undefinde();

}catch (err){

console,log(err); // 能够正常使用

  }

  console.log(err)  // ReferenceError: err not found

let 块作用域

var foo = true;

if(foo){

let bar = foo *2;

bar  = something(bar);

console.log(bar);

}

console.log(bar); // ReferenceError

变量提升,先有声明后又赋值。

foo();

function foo(){

console.log(a); // undefinded

var a = 2;

}

原因:相当于以下

function foo(){

var  a;

console.log(a); // undefined

a = 2;

}

foo();

注意: 函数声明会被提升,函数表达式不会被声明。函数和变量都会被提升,但是函数会被提前提升,然后是变量。

foo();   //1

var foo;

function foo(){

console.log(1);

}

foo = function() {

console.log(2)

}

  const  常量

后面的函数声明会覆盖前面的

foo(); // 3

function foo(){

console.log(1);

}

var foo = function() {

console.log(2);

}

function foo(){

console.log(3);

}

var a = 2 ; 的解析原则是  var  a 和  a = 2  当做两个单独的声明,第一个是编译阶段的

任务,第二个是执行阶段的任务。

闭包

function foo() {

var a = 2;

function bar(){

console.log(a);

}

return bar;

}

var baz = foo();

baz(); // 2

var fn;

function foo() {

var a  = 2;

function baz() {

console.log(a)

}

bar(baz);

}

function bar(fn){

fn();

}

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

(function(j){

setTimeout(function(){

console.log(j)

},j*1000)

})(i)

}

在迭代器内部使用IIFE会为每一个迭代都生成一个新的作用域。

块作用域和闭包联手

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

setTimeout(function timer(){

console.log(i)

},i*1000)

}

模块

function  CoolModule(){

var  something = "cool";

var another = [1,2,3];

function doSomething() {

console.log(something);

}

function doAnoth(){

console.log(another.join("!"));

}

return {

doSomething: doSomething,

doAnother: doAnother

};

}

var  foo = CoolModule();

foo.doSomething(); //cool

foo.doAnother() // 1!2!3

改为单例模式:

var foo = (function CoolModule(){

var something = "cool";

var another = [1,2,3];

function doSomething() {

console.log(something)

}

function doAnother(){

console.log(another.join("!"))

}

return {

doSomething: doSomething,

doAnother: doAnother

}

})();

foo.doSomething(); // cool

foo.doAnother(); //1!2!3

你不知道的javaScript笔记(1)的更多相关文章

  1. 你不知道的JavaScript笔记----对象

    对象: 1.定义对象属性 属性描述符(也称为:数据描述符) Object.defineProperty(Object,PropertyName,{ value: 6, writable: true, ...

  2. 你不知道的javaScript笔记(7)

    异步:现在与将来 分块的程序 可以把JavaScript 程序写在单独的js 文件中,这个程序是由多个块组成的,这些块 中只有一个是现在执行,其余在捡来执行,最常见的块单位是函数. 例如: funct ...

  3. 你不知道的javaScript笔记(6)

    语法 语句表达式 句子是完整表达某个意思的一组词,由一个或多个短语组成,他们之间由标点符号或者连接词连接起来. 语句相当于句子,表达式相当于短语,运算符则相当于标点符号和连接词. JavaScript ...

  4. 你不知道的javaScript笔记(5)

    原生函数 常用的原生函数 String() Number() Boolean() Array() Object() Function() RegExp() Date() Error() Symbol( ...

  5. 你不知道的javaScript笔记(4)

    类型: JavaScript 有7种内置类型 空值 (null) 未定义(undefined) 布尔值(boolean) 数字(number) 字符串(string) 对象(object) 符号(sy ...

  6. 你不知道的javaScript笔记(3)

    对象 对象可以通过两种形式定义: 声明形式和构造形式 声明形式语法: var myObj = {key:value} 构造形式语法: var myObj = new Object(); myObj.k ...

  7. 你不知道的javaScript笔记(2)

    this和对象原型 this是一个很特别的关键字,被自动定义在所有函数的作用域中 // foo.count 是0,字面理解是错误的 function foo(num) { console.log(&q ...

  8. 你不知道的Javascript(上卷)读书笔记之一 ---- 作用域

    你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些"坑",在这里写一些博客记录一下笔记以便消化吸收. 1 编译原理 在此 ...

  9. 你不知道的JavaScript上卷笔记

    你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章   初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...

随机推荐

  1. 《Java开发实战经典》读书笔记

    Java常用的内存区域: (1)      栈内存空间:保存所有的对象名称. (2)      堆内存空间:保存每个对象的具体属性内容. (3)      全局数据区:保存static类型的属性. ( ...

  2. sql查询结果多对多转为一对多返回前端

    企业表 ent_EnterpriseArchives  有id,企业名称 entName veh_Vehicle 车辆表,有所属企业id  companyId,车辆id,车牌号licPlate 目的是 ...

  3. 【Q】类和对象:游戏角色开发(角色介绍)

    案例情景:某公司要开发新游戏,请用面向对象的思想设计英雄类.怪物类和武器类. 编写测试类,创建英雄对象.怪物对象和武器对象,并输出各自的信息. 其中设定分别如下: 1.英雄类 属性:英雄名字.生命值. ...

  4. Android之侧滑导航栏

    今天学习的新内容是侧滑导航栏,我想大家肯定都比较熟悉了,因为这个效果在qq里面也有,最近一直跟室友们玩的游戏是快速让自己的头像的点赞量上千.当然我的效果跟qq是没有办法比的,因为那里面的功能是在是太强 ...

  5. Highcharts - Bar Chart & Column Chart

    1. 条形图(Bar Chart)需要的数据格式类型如下: ["Luke Skywalker", "Darth Vader", "Yoda" ...

  6. Android 环信聊天头像昵称显示解决方案

    从消息扩展中获取昵称和头像 昵称和头像的获取:把用户基本的昵称和头像的URL放到消息的扩展中,通过消息传递给接收方,当收到一条消息时,则能通过消息的扩展得到发送者的昵称和头像URL,然后保存到本地数据 ...

  7. Windows怎样共享文件夹给Virtualbox 里面的Ubuntu

    主要命令 1.  sudo mount -t vboxsf Share /media/sf_Share 2.   sudo adduser userid vboxsf

  8. Qt之QSS(Q_PROPERTY-原始属性)

    http://blog.csdn.net/liang19890820/article/details/51698536 版权声明:进步始于交流,收获源于分享!纯正开源之美,有趣.好玩.靠谱...作者: ...

  9. matlab练习程序(演化策略ES)

    还是这本书上的内容,不过我看演化计算这一章是倒着看的,这里练习的算法正好和书中介绍的顺序是相反的. 演化策略是最古老的的演化算法之一,和上一篇DE算法类似,都是基于种群的随机演化产生最优解的算法. 算 ...

  10. Java Web 常用在线api汇总(不定时更新)

    1.Hibernate API Documentation (3.2.2.ga) http://www.hibernate.org/hib_docs/v3/api/ 2.Spring Framewor ...