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);

原文地址:https://www.cnblogs.com/code-klaus/p/8602541.html

时间: 2024-10-29 11:31:00

js作用域相关知识总结的相关文章

js作用域相关笔记

1.js引擎.编译器.作用域. 引擎:负责JS全过程的编译和执行: 编译器:负责语法分析和代码生成: 作用域:负责收集并维护声明组成的查询,以及当前执行代码对这些变量的访问权限(简言之,作用域就是用于编译和执行的一套规则). 三者的关系:编辑器要编译的时候会询问作用域,引擎要执行代码的时候也会询问作用域. 2.LHS和RHS查询都是从当前执行作用域开始,若没找到所需标识符,以此向上级作用域查找,直到顶层作用域,若仍未找到,会抛出ReferenceError异常(TypeError这个异常,是操作

js键盘相关知识总结

一.相应事件 keydown:按下键盘上的任意键都可触发,按着不放则重复触发 keypress:按下键盘上的字符键时触发,按着不放则重复触发 keyup:释放按键时触发 事件顺序:keydown>keypress>keypup 在文本框中捕获按键事件需要注意的地方: 1.keydown.keypress是在文本框内容变化前发生,keyup则是在文本框变化后发生. 2.如果输入的是中文,keypress不会触发 二.如何获取按键值 在js获取键盘按下的键值有:event.keyCode.even

js事件相关知识

事件 事件就是用户或浏览器自身执行的某种动作,如click.load等,都是事件的名字.而响应某个事件的函数就是事件处理程序或事件侦听器,通常以“on+事件名字”命名,如onclick.onload. 事件最早是在IE3和Netscape Navigator2中出现的,当时是作为分担服务器运算负载的一种手段.在IE4和Navigator4发布时提供了相似但不相同的API. 事件流 从页面中接收事件的顺序.IE和Netscape开发团队提出了差不多是完全相反的事件流的概念.IE提出的是事件冒泡流,

基础知识回顾——js作用域

1.对js作用域的理解. 作用域 作用域分为全局作用域和函数作用域,我们可以理解为变量的生存环境(空间).全局作用域包含函数作用域,函数作用域里的变量可以访问到全局作用域中的变量,但是反之则不行. 变量提升 在js作用域中还有变量提升的现象(只有var 声明的变量才会有变量提升,window声明的不会),赋值语句最后生效.当我定义一个变量,如果它没有被赋值,它是属于undefined: 变量提升的优先级 函数声明 > 函数形参(函数的形参属于函数作用域:) > 自定义变量 延长作用域,闭包(r

php学习day7--函数的相关知识

今天我们主要学了函数的相关知识,是个比较基础的知识,但也是很重要的. 一.函数 函数就类似于一个工具,我们写好函数之后可以直接进行调用,可以很大的减少代码的从用性,提高页面性能和可读性. 1.函数的定义 在php中函数的定义方式为: function  name($形参1,$形参2.....){ 要执行的代码 return  123: } 在上方的函数定义式中,name代表函数名,小括号内是形参,是用来传递参数,花括号中的就是调用时需要执行的代码. 函数的调用方式: name(实参1,实参2,.

【转载】前端面试“http全过程”将所有HTTP相关知识抛出来了...

原文:前端面试“http全过程”将所有HTTP相关知识抛出来了... 来一篇串通,一个http全过程的问题,把所有HTTP相关知识点都带过一遍 http全过程 输入域名(url)-->DNS映射为IP-->TCP三次握手-->HTTP请求-->HTTP响应-->(浏览器跟踪重定向地址)-->服务器处理请求-->服务器返回一个html响应-->(视情况决定释放TCP连接)-->客户端解析HTML-->获取嵌入在HTML中的对象重新发起http请求

grunt 相关知识

module.exports = function(grunt){ // 项目配置 grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), uglify: { options: { banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'//添加banner }, //任务一:压缩a.js,不混淆变量名

web聊天相关知识

http相关知识 http是无状态,请求,响应模式的通信模式,就是用户每次通过浏览器点击一下页面,都需要重新与web服务器建立一下连接,且发送自己的 session id 给服务器端以使服务器端验证此用户的身份.客户端若想从web服务器上获取数据,必须主动发起一个请求,然后接收服务器端的返回,服务器端不会主动向客户端推送消息. 基于传统的web服务器只会被动响应客户端请求的这个特性,想实现web实时聊天的需求,有以下几个方式:   轮询(polling) 轮询,客户端向服务器发出请求以获取一些数

AJAX跨域调用相关知识-CORS和JSONP(引)

AJAX跨域调用相关知识-CORS和JSONP 1.什么是跨域 跨域问题产生的原因,是由于浏览器的安全机制,JS只能访问与所在页面同一个域(相同协议.域名.端口)的内容. 但是我们项目开发过程中,经常会遇到在一个页面的JS代码中,需要通过AJAX去访问另一个服务器并返回数据,这时候就会受到浏览器跨域的安全限制了. 这里要注意,如果只是通过AJAX向另一个服务器发送请求而不要求数据返回,是不受跨域限制的.浏览器只是限制不能访问另一个域的数据,即不能访问返回的数据,并不限制发送请求. 我们接下来就为