前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你不知道的javaScript笔记(1)

你不知道的javaScript笔记(1)

作者头像
用户1197315
发布2018-01-22 11:58:06
6240
发布2018-01-22 11:58:06
举报
文章被收录于专栏:柠檬先生柠檬先生

规避冲突

代码语言:js
复制
 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 立即执行函数表达式

代码语言:js
复制
 var a = 2; 
 (function IIFE(global){
 var a = 3;
 console.log(a); // 3
 console.log(global.a) // 2
 })(window)
 console.log( a)  // 2
 

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

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

代码语言:js
复制
 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{

代码语言:js
复制
undefinde();
}catch (err){
console,log(err); // 能够正常使用
  }
  console.log(err)  // ReferenceError: err not found

let 块作用域

代码语言:js
复制
 var foo = true;
 if(foo){
 let bar = foo *2;
 bar  = something(bar);
 console.log(bar);
 }
 console.log(bar); // ReferenceError
 

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

代码语言:js
复制
 foo();
 function foo(){
 console.log(a); // undefinded
 var a = 2;
 }
 

 原因:相当于以下

代码语言:js
复制
   function foo(){
 var  a;
 console.log(a); // undefined
 a = 2;
 }
 foo();
 

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

代码语言:js
复制
 foo();   //1
 var foo;
 function foo(){
 console.log(1);
 }
 foo = function() {
 console.log(2)
 }
 

  const  常量

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

代码语言:js
复制
 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  当做两个单独的声明,第一个是编译阶段的

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

闭包

代码语言:js
复制
 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会为每一个迭代都生成一个新的作用域。

块作用域和闭包联手

代码语言:js
复制
 for(var i = 1; i <= 5; i++){
 setTimeout(function timer(){
 console.log(i)
 },i*1000)
 }
 

模块

代码语言:js
复制
 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
 

改为单例模式:

代码语言:js
复制
 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
 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-06-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档