总结函数声明提升,闭包,作用域,this
来源:互联网 发布:xbox360 知乎 编辑:程序博客网 时间:2024/05/22 04:29
JS作用域链
var n = 120;function a(){var n = 100;console.log(n);}a();//100function b(){console.log(n);}b();//120function c(){n = 100;console.log(n);}//100,注意:不加var是一个全局变量/*function a(){var n = 120;}console(n);*/
在函数外部找函数内部变量,找不到/*function a(){var n = 120;}console(n);//会报错!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
函数声明提升
/*var a = 18;function f1(){ var b=9; console.log(a); //undefined console.log(b); //9 var a = '123';}f1();//从这个例子告诉我们函数声明提升,我们可以理解为执行f1()时,提前声明var a,b;当console.log(a);时,a已被定义未被赋值所以打印出undefined*/
闭包
因为js的函数都是一个个小黑屋,函数内部可以看到外部的变量,函数外部不能看到函数内部的变量。通俗易懂的理解就是函数内部的函数,来让外部引用内部的变量。这样做的好处是更好的实现函数封装。
function a(){ var n = 0; function b(){ console.log(n); } return b;}var c = a();c(); // 0
匿名函数的传参
/*匿名函数var a = (funcion(){})();第一个()中是匿名函数,如果有返回值,则把返回值赋给a; 第二个()中是要给匿名函数传递的参数;*/var a = (function (){ var i = 1 i++; return i;})(a);console.log(a);//a=2;var b=5;var a = (function(){ var i = 1; return b+i;})(b);console.log(a);//a=6var a = (function(){ var i=1; return i;})();console.log(a);//a=1var a = (function(){ var i=1;})();console.log(a);//a=undefind
this的用法
首先在js中this是谁调用他,他就指向谁。比如在浏览器环境里,全局变量this指向的是window。
浏览器渲染机制
head中的脚本会在页面加载之前解析,可以保证脚本在任何调用之前被加载
body中会在页面加载完成之后读取,放在body部分的脚本通常被用来生成页面的内容。 因为加载js脚本会阻塞页面的加载,为了用户体验也为了脚本可以操作dom,一般放在body中, 浏览器解析html是从上到下的。 如果把js放在head里的话,则先被解析,但这时候body还没有解析,所以会返回空值。一般都会绑定一个监听,当全部的html文档解析完之后,再执行代码:
windows.onload=function(){ }
理解一下这段JS代码执行结果
var num =20;var obj= {num:30,fn: (function(num){this.num*= 3;num+=15;var num=45;return function() {this.num*=4;num+=20;console.log(num);}})(num)};var fn=obj.fn;fn();obj.fn();console.log (window.num) ;console.log(obj.num) ;</script>
console结果为???
因为执行fn()时return的匿名函数console.log的是num,这是谁指向他,他就调用谁的num。这时num为45.num+20=65。
所以当obj.fn()执行时,num+20=65+20=85。
第一次fn()执行,this指向的是window,this.num就为20,执行*3,再执行*4就为24。
第二次执行obj.fn(),this指向的obj,此时this.num为30。执行return里面*4,所以为120。
最后console.log(window.num);为240
console.log(obj.num);为120
阅读全文
0 0
- 总结函数声明提升,闭包,作用域,this
- JavaScript的变量及函数(变量提升、嵌套作用域、条件语句、严格模式、IIFE、闭包、模块化、this、原型)
- javascript--作用域,声明提前和this关键字总结
- js变量声明提升,变量作用域与函数作用域,作用域链
- 深入理解ECMAScript中的声明提升、this关键字及作用域(链)
- 变量声明和函数声明会提升到当前作用域顶部
- Javascript This.作用域.闭包
- 作用域 闭包 this关键字
- JavaScript闭包作用域与this
- JavaScript 变量作用域、this、闭包
- JavaScript 变量作用域、this、闭包
- js 静态作用域 闭包 this
- javascript作用域和闭包,this
- JS变量提升、匿名函数、原型继承、作用域、闭包机制等。
- javascript作用域和声明提升
- JS-作用域与变量声明提升
- JavaScript 变量作用域和声明提升
- JavaScript(面向对象+原型理解+继承+作用域链和闭包+this使用总结)
- X君和T君关于通用学习机的对话
- Lintcode163 Unique Binary Search Trees solution 题解
- Unity3D默认的快捷键
- 数组、链表、堆栈、队列和树
- 关于win7电脑使用ARCGIS9.3时的问题
- 总结函数声明提升,闭包,作用域,this
- 1039. 到底买不买(20)
- 关系型数据库的ACID指的是什么?
- mysql切换数据库时会报错:ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'mysql'
- 割草机
- 【备忘】年薪50万2017年最新北风网Spark2.0从入门到精通教程
- Java之国际化操作
- 网络流之最大流
- C语言指针使用中的常见错误