面试题-JS中的作用域相关问题

对象类型:

  • 原始数据类型存储的是值,而对象类型存储的是地址(指针)。下面的这个例子就比较有意思了。

先看题:  

 function test(person) {
  person.age = 26
  person = {
    name: ‘yyy‘,
    age: 30
   }
    return person
  }

  const p1 = {
    name: ‘yck‘,
    age: 25
  }
// 问题1:
  const p2 = test(p1)
  console.log(p1) //---->???
// 答案1:{name:‘yck‘,age:26}

// 问题2:
  console.log(p2)//---->???
// 答案2:{name:‘yyy‘,age:30}

对于理解问题1需要明确的:

  • a.首先要明确的是js函数中所有参数都是按照值进行传递的。
  • 参数传递过程中有分为两种情况:①被传递参数类型为值类型;②被传递参数类型为引用类型
    •   被传递参数为值类型的时候,就将值复制一个给参数(函数的局部变量);
    •   被传递的参数为引用类型的时候,就将这个值内存的指针复制一个给参数(函数的局部变量)

  首先person复制到了p1的地址(这里p1是引用类型,p1和person指向同一个地址),进入到test函数, p1对象和函数内的局部变量person拥有同一个指针,所以当在函数内修改age的值为26时,p1对象的age也会被修改为26;

  但是当在函数内部将person重写为其他对象的时候,就相当于把函数内的person之前的指针给修改了(这个地方注意了,只是内部的person修改了, 外面的p1现在已经和他没有联系了,之前有联系是因为二者指向同一个地址,现在内部的局部变量的指针指向了新的对象,而p1依然是被修改过的);

  所以控制台的console.log的结果是{name:‘yck‘,age:26}

问题2: console.log(p2)//---->??? 答案2:{name:‘yyy‘,age:30} 这个地方没什么好说的了,p2等于函数return的这个新对象。

原文地址:https://www.cnblogs.com/nayek/p/11816191.html

时间: 2024-08-30 04:42:32

面试题-JS中的作用域相关问题的相关文章

js中的作用域链

js中的执行环境: 所谓执行环境(有时也称环境)它是JavaScript中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据 ,决定了它们各自的行为.而每个执行环境都有一个与之相关的变量对象,环境中定义的所有变量和函数都保存在这个对象中. js中的作用域链: 每个函数都有自己的执行环境,当代码在执行环境中执行时,就会创建变量对象的作用域链.作用域链保证了对执行环境有权访问所有变量和函数的有序访问.作用域链的前端,始终都是当前执行的代码所在的环境的变量对象,如果环境是一个函数,那么它的

理解js中的作用域以及初探闭包

前言 对于js中的闭包,无论是老司机还是小白,我想,见得不能再多了,然而有时三言两语却很难说得明白,反正在我初学时是这样的,脑子里虽有概念,但是却道不出个所以然来,在面试中经常会被用来吊自己的胃口,考察基础,虽然网上自己也看过不少相关闭包的文章,帖子,但貌似这玩意,越看越复杂,满满逼格高,生涉难懂的专业词汇常常把自己带到沟里去了,越看越迷糊,其实终归结底,用杨绛先生的一句话就是:"你的问题在于代码写得太少,书读得不够多",其实在我看来前者是主要的,是后者的检验, 自知目标搬砖20年(还

PHP和JS中变量作用域

一,PHP中变量作用域 对于大多数PHP的变量只有一个作用域.在用户自定义函数里采用局部变量作用域.所有的函数内使用的变量被设置为局部变量.例如: <?php $a=1; function test() { echo $a; } test(); ?> 这段程序不会输出任何的东西因为echo语句要输出局部变量 $a ,而函数内的 $a 从未被赋过值.你可能注意到和C语言有点小小的区别,C中全局变量可以直接在函数内引用,除非它被一个局部变量所覆盖.因为这使得人们可能不注意修改了全局变量的值.在PH

JS中字符串的相关操作

(转自:http://www.cnblogs.com/zhaoxinxin/articles/1402733.html) 一.字符串的创建 创建一个字符串有几种方法. 最简单的是用引号将一组字符包含起来,可以将其赋值给一个字符串变量. var myStr = "Hello, String!"; 可以用双引号或单引号将字符串包含,但要注意,作为界定字符串的一对引号必须是相同的,不能混用. 像var myString = "Fluffy is a pretty cat.'; 这样

JS中的作用域和闭包

作用域:在编程语言中,作用域控制着变量与参数的可见性及生命周期.JS确实有函数作用域,那意味着定义在函数中的参数和变量在函数外部是不可见的,而且在一个函数中的任何位置定义的变量在该函数中的任何地方都是可见的. var a = 1; var fs = function (){ var b = 2; var c = 4 var fun = function (){ var c = 3; alert(a) //输出1 alert(b) //输出2 alert(c) //输出3 } fun(); } f

js中scroll滚动相关

js中scroll滚动相关 scroll,滚动,一般讨论的是网页整体与浏览器之间的关系. 一.元素相关 属性/方法 解释 element.scrollHeight 返回元素的整体高度. element.scrollWidth 返回元素的整体宽度. element.scrollLeft 返回元素左边缘与视图之间的距离. element.scrollTop 返回元素上边缘与视图之间的距离. 这四个属性,全部是只读属性 其中,无非就是分为宽高和左上. 两个方向. 1.scrollHeight 和 sc

聊一下JS中的作用域scope和闭包closure

scope和closure是javascript中两个非常关键的概念,前者JS用多了还比较好理解,closure就不一样了.我就被这个概念困扰了很久,无论看别人如何解释,就是不通.不过理越辩越明,代码写的多了,小程序测试的多了,再回过头看看别人写的帖子,也就渐渐明白了闭包的含义了.咱不是啥大牛,所以不搞的那么专业了,唯一的想法就是试图让你明白什么是作用域,什么是闭包.如果看了这个帖子你还不明白,那么多写个把月代码回过头再看,相信你一定会有收获:如果看这个帖子让你收获到了一些东西,告诉我,还是非常

js中的作用域和作用域链

作用域1. 全局作用域2. 函数作用域这里扯出来下js的函数声明和变量声明提升,直接来两段代码 if (!a in window) { var a = 1; } console.log(a) //undefined 嗯,为什么呢?因为var声明的变量会变量声明提升,所以相当于执行if判断的时候a变量已经声明过了,而此时a是一个全局变量既是window对象的一个属性,所以这里压根没有进if判断,所以这里打印出来的是undefined再来一段坑坑的代码 (function (){ var a = b

Js中函数作用域问题

var a="111"; function fn(){ alert(this.a);} function fn2(){ var a="222" fn();//输出是111,而不是222} js中函数的作用域取决于定义它的地方而不取决于执行他的地方.