js作用域相关知识总结
以前总是搞不清楚js里面的作用域、块级作用域、预解析,做题总做错,今天彻底搞明白了,来记录梳理一下~
块级作用域
在其他语言中,任何一对花括号中的语句都属于一个块儿,在这之中定义的所有变量在代码块外都是不可见的。Js中没有块级作用域
一个感觉在面试中会经常遇到的问题
for(var i =0;i<10;i++){
var num = 100;
}
console.log(i); //i是多少
第一反应是i是9,但是错了,i是10。因为按照循环条件,i肯定是在0-10之间,当i=9的时候,都还在执行循环体,然后9++到10,不符合循环条件,跳出循环,所以此时i是10
变量的使用范围
1.局部变量
因为js里面没有块级作用域,当一个变量声明在函数的内部,此时这个变量叫做局部变量,它不能在函数外部被访问到
function f1(){
var num = 1000;
}
f1();
console.log(num);
2.全局变量
直接在script标签中定义的变量,或者说是不在函数中定义的变量都叫做全局变量
var num = 1000;
</script> <script>
function f1(){
console.log(num);
}
f1(); </script>
3.隐式全局变量
隐式全局变量:当一个变量声明的时候,没有使用var,那么这个变量就是隐式全局变量
注意!
通过var创建的全局变量是不可被删除的,而隐式全局变量是可以被删除的。这表明在技术上,隐式全局变量并不是真的全局变量,它们是全局对象的属性,属性是可以通过delete删除的,而变量不能。
var num = 1000;
num2 = 200;
delete num;
delete num2;
console.log(typeof num); //number 这里即使用delete删除了num,它的类型还是number 无法真正被删除
console.log(typeof num2); //undefined 而隐式全局变量很容易被删除了
变量退出作用域后会被销毁,全局变量关闭网页或浏览器之后才会被销毁/释放
function f1(){
var num = 10;
}
f1();
这个函数被调用以后,变量所占的空间就被释放了——因为这个函数被用完了
**回调函数粗略的讲解
回调函数:函数作为另一个函数的参数使用
function getSum(x,y){
return x + y;
}
function ff(x,y,fn){ //fn作为一个参数
return fn(x,y); //fn是一个函数,并且被调用了
}
var result = ff(1,5,getSum); //给fn传参
console.log(result)
函数还可以作为另一个函数的返回值调用
function f1(){
return function (){
console.log(123);
}
}
var result = f1(); //函数赋值给result
//console.log(result) 错误写法 这样只会打印出来f1的函数体
result();
little Trick
function aa(){
alert('aaaa');
return function (){
alert('bbbb');
}
} alert(aa); alert(aa()); alert(aa()());这三个结果分别是什么?
结果1 函数名打印出来是整个函数体
结果2 弹出aaaa和返回值内的匿名函数,原因是,函数被调用后内部执行了这段代码,然后匿名函数并未被调用,所以返回的是整段匿名函数体
结果3 弹出aaaa,bbbb,和undefined 匿名函数也被调用了,所以弹出了bbbb 为什么会再弹一次undefined呢~?
arguments对象
arguments是一个对象,一个伪数组,可以获取函数参数的个数
**伪数组的概念:可以使用.length,但是不可以调用数组的方法。
function f1(){
var sum = 0;
for(var i =0;i<arguments.length;i++){
sum += arguments[i]; //arguments是一个伪数组。它可以指代函数的参数
}
return sum;
}
var result = f1(10,22,11,33,155);
console.log(f1);
js作用域相关知识总结的更多相关文章
- JS作用域相关知识(#精)
在学习<你不知道的JS>一书中,特将作用域相关知识在此分享一下: #说到作用域,就不得不提到LHS查询和RHS查询: 1)如果查询目的是对变量进行赋值,则使用LHS查询 2)如果查询目的是 ...
- JS基础理论相关知识
1.XHTML和HTML有什么区别 HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言最主要的不同:XHTML 元素必须被正确地嵌套.XHTML 元素必须被关闭.标签名必须用 ...
- js作用域相关笔记
1.js引擎.编译器.作用域. 引擎:负责JS全过程的编译和执行: 编译器:负责语法分析和代码生成: 作用域:负责收集并维护声明组成的查询,以及当前执行代码对这些变量的访问权限(简言之,作用域就是用于 ...
- js数组相关知识集合
一.js数组快速排序 <script type="text/javascript"> var arr = [1, 2, 3, 54, 22, 1, 2, 3]; fun ...
- js键盘相关知识总结
一.相应事件 keydown:按下键盘上的任意键都可触发,按着不放则重复触发 keypress:按下键盘上的字符键时触发,按着不放则重复触发 keyup:释放按键时触发 事件顺序:keydown> ...
- codewars--js--vowels counting+js正则相关知识
问题描述: Return the number (count) of vowels in the given string. We will consider a, e, i, o, and u as ...
- css+js+html基础知识总结
css+js+html基础知识总结 一.CSS相关 1.css的盒子模型:IE盒子模型.标准W3C盒子模型: 2.CSS优先级机制: 选择器的优先权:!important>style(内联样式) ...
- JS 作用域与变量提升---JS 学习笔记(三)
你知道下面的JavaScript代码执行时会输出什么吗? var foo = 1; function bar() { if (!foo) { var foo = 10; } console.log(f ...
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
随机推荐
- 设计模式之——visitor模式
visitor模式,又叫访问者模式,把结构和数据分开,编写一个访问者,去访问数据结构中的元素,然后把对各元素的处理全部交给访问者类.这样,当需要增加新的处理时候,只需要编写新的 访问者类,让数据结构可 ...
- 知乎live 我的读书经验 总结
https://www.zhihu.com/lives/757587093366009856/messages 碎片化阅读没有意义, 捡硬币捡成富翁 kindle不能全文检索 短篇文章的阅读是否有 ...
- Grafana+Prometheus监控
添加模板一定要看说明以及依赖 监控redis https://blog.52itstyle.com/archives/2049/ http://www.cnblogs.com/sfnz/p/65669 ...
- CSRF攻击详解(转)
原文:http://www.django-china.cn/topic/580/ 一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称 ...
- Mirror--镜像断开的解决办法
如果镜像在搭建一段时候后出现问题,可能存在以下原因: 1. 因为主库或镜像库存在内存压力,导致无法完成镜像日志传送和重做 解决办法:设置数据库最小内存,保证数据库有足够内存完成镜像操作 2. 因为主库 ...
- Linux下编译安装PHP扩展memcached
[安装 libevent] $ tar zxvf libevent-2.0.20-stable.tar.gz $ cd libevent-2.0.20-stable/$ ./configure --p ...
- [py]数据描述符优先级
实例查找属性的顺序: 类属性 > 数据描述符 > 实例属性 > 非数据描述符 > __getattr__ 类属性>数据描述符>实例属性 class Str: def ...
- Django 基础篇章
Django 紧紧地遵循这种 MVC 模式,可以称得上是一种 MVC 框架. 以下是 Django 中 M.V 和 C 各自的含义: M ,数据存取部分,由django数据库层处理. V ,选择显示哪 ...
- TCP三次握手四次挥手详解2
相对应socket开发者,TCP创建过程和连接拆除过程是由TCP/IP协议栈自动创建的,因此开发者并不需要控制这个过程,但是对于理解TCP底层运作机制,相当有帮助 TCP三次握手 所谓三次握手,是指建 ...
- 通过前端控制器源码分析springmvc的执行过程
第一步:前端控制器接收请求调用doDiapatch 第二步:前端控制器调用处理器映射器查找 Handler 第三步:调用处理器适配器执行Handler,得到执行结果ModelAndView 第四步:视 ...