JS作用域面试题总结

关于JS作用域问题,是面试的时候面试官乐此不疲的面试题,有时候确实是令人抓狂,今天看到一个讲解这个问题的视频,明白了那些所谓的“原理”顿时有种豁然开朗的感觉~~~

1.js作用域(全局变量,局部变量)内部可以访问外部,但外部的不能访问内部的(局域变量)

var a=10;
function aaa(){
    alert(a);
};
aaa(); //a 为外部变量即全局变量,所以可以直接访问到 结果为10
function aaa(){
var a=10;
};
aaa();
alert(a); //a 为函数aaa()内部变量量即局部变量,所以无法访问到
var a=10;
function aaa(){
 alert(a);
};
function bbb(){
var a=20;
aaa();
}
bbb(); //结果为10,因为aaa()函数不能访问到bbb()里面的局部变量,所以访问到的是a=10,这个全局变量。

 2.不用var 定义变量时,会默认为是全局变量(不规范,不推荐)

function aaa(){
   a=10;
}
aaa();
alert(a); //结果为10;
//等价于:
var a;
function aaa(){
  a=10;
};
aaa();
alert(a);

//给未声明的变量赋值,此变量就会变成全局变量;var a=b=10; 可以解析成 b=10;var a=b; 也就是b为全局变量,a为局部变量,所以外部访问a访问不到,访问b结果为10;

所以为了避免出现这种隐患,我们在定义变量的时候把所有要定义的变量都加上var;

function aaa(){
      var a=b=10;
} aaa(); alert(a);//结果为,无法访问到 alert(b);//结果为10;

3.变量的查找是就近原则去寻找,定义的var变量;第二点,变量的声明被提前到作用域顶部,赋值保留在原地,如下dome;

function aaa(){
  alert(a);
  var a=20;
}
aaa(); //结果为:undefined  /**************/
var a=10;function aaa(){
  alert(a);
  var a=20;
}
aaa(); //结果为:undefined可以解析为是:var a=10;function aaa(){  var a;  alert(a);  a=20;}aaa();
4.当参数跟局部变量重名的时候,优先级是等同的
    var a=10;
    function aaa(a){
        alert(a);
        var a=20;  //因为 a 是形参,优先级高于 var a; 所以 局部变量a的声明其实被忽略了。
    }
    aaa(a); //结果为:10
5.变量修改的时候另一个变量会跟着变化,但是当变量重新被定义时,则另一个不变化
var a=[1,2,3];
var b=a;
b.push(4);
alert(a);//结果为[1,2,3,4] 当b改变的时候a也发生了改变
当b重新被赋值的时候 a不会改变.示例:
var a=[1,2,3];
var b=a;b=[1,2,3,4]alert(a)//结果为[1,2,3]


				
时间: 2024-12-17 22:32:09

JS作用域面试题总结的相关文章

大部分人都会做错的经典JS闭包面试题

大部分人都会做错的经典JS闭包面试题 目录 由工作中演变而来的面试题 JS中有几种函数 创建函数的几种方式 三个fun函数的关系是什么? 函数作用域链的问题 到底在调用哪个函数? 后话 由工作中演变而来的面试题 这是一个我工作当中的遇到的一个问题,似乎很有趣,就当做了一道题去面试,发现几乎没人能全部答对并说出原因,遂拿出来聊一聊吧. 先看题目代码: function fun(n,o) { console.log(o) return { fun:function(m){ return fun(m,

JS(作用域)_关于作用域的注意点

一.前言 最近复习的时候总算是把以前作用域涉及到的模糊的概念弄得差不多了. 以下是几个关于js作用域中重要的概念 二.主要知识 1.Js因为 JavaScript 采用的是静态作用域,函数的作用域在函数定义的时候就决定了. 举例: 1 var value = 1; 2 3 function foo() { 4 console.log(value); 5 } 6 7 function bar() { 8 var value = 2; 9 foo(); 10 } 11 12 bar();//1 /*

关于js作用域

我们知道在编程语言中,作用域的作用就是控制变量.参数的可见范围和生命周期. js中提供了函数作用域的功效,比如在函数中定义的变量外部是无法访问到的: function jsFunc(){ var a = 5; } alert(a); // undefined 但是js中却没有提供块作用域的功效,比如我们在java代码中如果些如下代码: public static Boolean b = false; public static void main(String[] args) { if(!b){

js作用域理解 function(){} var

在coding过程中遇到过下面的情况: 1 var test1 = function(){ 2 var c=4; 3 test2(); 4 }; 5 6 var test2 = function(){ 7 console.log(c); 8 }; 9 10 test1(); 思考一下,7行会conasole出什么?4 吗?实际上却是 c is not defined. 而当代码如下的时候, 1 var test1 = function(){ 2 var c=4 3 var test2 = fun

几道js的笔试题

一.今天在群里看见有同学发了几道关于js的笔试题,拿来研究一下,虽然自己看过了高级程序设计,也看了javascript语言精粹,自以为对js还是有一些理解的,但是真正遇到问题的时候,发现并不能融会贯通,掌握的不扎实.借此机会来回顾一下,共同学习~ 二.几道小题(写出以下几道题的弹出框的内容) (1) 1 if(!("a" in window)){ 2 var a=1; 3 } 4 alert(a); 解析:正常的思路:首先需要了解函数声明提升的概念,在执行代码之前,会先读取函数或者变量

js作用域的几个问题

按照<权威指南>的说法,全局的变量作用域是全局性的,在js代码中,他处处都有定义.而在函数之内声明的变量,就只有在函数体内有定义了.函数的参数也是局部变量,他们只在函数体内部有定义.在函数体内部,局部变量的优先级比同名的全局变量高.如果给一个局部变量或函数的参数声明的名字与全局变量的名字相同,那么就有效地隐藏了这个全局变量. js没有块级作用域,,函数中声明的所有变量,无论在哪里,如for ,if等,在整个函数中他们都是有定义的.这个也叫变量提升,作用域都是在函数中. 1,对象内部的作用 ?

JS作用域链

Js作用域与执行环境: 1. 作用域链: <1>用途:保证对执行环境有权访问的所有变量和函数的有序访问. <2>构成: a.作用域链的前端,始终都是当前执行代码所在环境的变量对象(如果这个环境是函数,则将其活动对象作为变量对象,活动对象在最开始时只包含一个变量,即arguments对象): b.下一个变量对象来自包含(外部)环境: c.最后一个对象,为全局执行环境的变量对象. <3>标识符解析:是沿着作用域链一级一级地搜索标识符的过程,始终从作用域链的前端开始,然后逐级

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

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

经典js闭包----对《大部分人都会做错的经典JS闭包面试题》的理解

重新看js闭包的时候看到了<大部分人都会做错的经典JS闭包面试题>,自己理解并记录了下想法.很多部分博主已经讲得很详细了,只是后面的解释部分文字有点绕. 原帖地址:http://web.jobbole.com/84328/ 先贴代码 1 function fun(n,o){ 2 console.log(o); 3 return { 4 fun:function(m){ 5 return fun(m,n); 6 } 7 } 8 } 9 10 var a = fun(0); 11 a.fun(1)