你不知道的javaScript笔记(1)
规避冲突
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)的更多相关文章
- 你不知道的JavaScript笔记----对象
对象: 1.定义对象属性 属性描述符(也称为:数据描述符) Object.defineProperty(Object,PropertyName,{ value: 6, writable: true, ...
- 你不知道的javaScript笔记(7)
异步:现在与将来 分块的程序 可以把JavaScript 程序写在单独的js 文件中,这个程序是由多个块组成的,这些块 中只有一个是现在执行,其余在捡来执行,最常见的块单位是函数. 例如: funct ...
- 你不知道的javaScript笔记(6)
语法 语句表达式 句子是完整表达某个意思的一组词,由一个或多个短语组成,他们之间由标点符号或者连接词连接起来. 语句相当于句子,表达式相当于短语,运算符则相当于标点符号和连接词. JavaScript ...
- 你不知道的javaScript笔记(5)
原生函数 常用的原生函数 String() Number() Boolean() Array() Object() Function() RegExp() Date() Error() Symbol( ...
- 你不知道的javaScript笔记(4)
类型: JavaScript 有7种内置类型 空值 (null) 未定义(undefined) 布尔值(boolean) 数字(number) 字符串(string) 对象(object) 符号(sy ...
- 你不知道的javaScript笔记(3)
对象 对象可以通过两种形式定义: 声明形式和构造形式 声明形式语法: var myObj = {key:value} 构造形式语法: var myObj = new Object(); myObj.k ...
- 你不知道的javaScript笔记(2)
this和对象原型 this是一个很特别的关键字,被自动定义在所有函数的作用域中 // foo.count 是0,字面理解是错误的 function foo(num) { console.log(&q ...
- 你不知道的Javascript(上卷)读书笔记之一 ---- 作用域
你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些"坑",在这里写一些博客记录一下笔记以便消化吸收. 1 编译原理 在此 ...
- 你不知道的JavaScript上卷笔记
你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章 初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...
随机推荐
- node会话管理——cookie-parser
cookie是由服务器发送给客户端(浏览器)的小量信息. 我们知道,平时上网时都是使用无状态的HTTP协议传输出数据,这意味着客户端与服务端在数据传送完成后就会中断连接.这时我们就需要一个一直保持会话 ...
- 码农的好助手:版本管理工具git的使用
一.什么是github? GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub. GitHub 于 2008 年 4 月 10 日 ...
- Java日志框架解析及实战分析
转载自: https://zhuanlan.zhihu.com/p/24272450 https://zhuanlan.zhihu.com/p/24275518 作为Java程序员,幸运的是,Java ...
- Scrapy框架之基于RedisSpider实现的分布式爬虫
需求:爬取的是基于文字的网易新闻数据(国内.国际.军事.航空). 基于Scrapy框架代码实现数据爬取后,再将当前项目修改为基于RedisSpider的分布式爬虫形式. 一.基于Scrapy框架数据爬 ...
- IS Decisions如何帮助企业提高安全标准
PCI DSS标准有什么要求? 简单地说,PCI DSS要求最高级别的网络安全性.这一标准如今广泛应用于需要存储.管理.传输客户(或持卡人)个人数据的行业和领域. 施行严格的访问监控措施 为了保证关键 ...
- 保存及读取keras模型参数
转自:http://blog.csdn.net/u010159842/article/details/54407745,感谢分享~ 你可以使用model.save(filepath)将Keras模型和 ...
- js原形对象
function clock(hour,minute,second){ this.constructor = clock ;//默认实现 /**/ } clock.prototype={ constr ...
- constructor()方法
在做微信小程序的时候,需要对传输的数据进行加密,大牛给我介绍constructor()方法,不是很懂这个但是用了一次,今天来用自己的想法来理解这个方法 ———————————————————————— ...
- sqlalchemy & python & datatables & javascript 中文拼音排序
近期有中文拼单排序需要,查询资料,mysql数据库有convert函数支持 select cname from channel order by convert(cname using gbk); # ...
- ubuntu或者debian安装php-gd扩展错误
‘./configure’ ‘–prefix=/usr/local/php’ ‘–with-config-file-path=/etc’ ‘–with-mysql=/usr/local/mysql’ ...