首页 >

JavaScript修改作用域外变量办法【javascript】

web前端|js教程JavaScript修改作用域外变量办法【javascript】
js作用域,外变量,javascript的作用域
web前端-js教程
1.今天在看JavaScript学习指南的时候做的课后习题,也因此详细的对函数的传入参数进行比较深入的研究.
电影源码自动采集,vscode 语言服务器,ubuntu 命令接口,tomcat移除后怎么,狗窝里爬虫,php 识别换行符,山西seo优化哪家靠谱,有明星的网站模板,kyt模板lzw
题目如下:
非法融资网站源码,vscode 开发ros,虚拟机Ubuntu内存突然变大,怎么查询tomcat,sqlite微信重组,json 美化 插件,小程序前端框架设计,如何编写网络爬虫程序,php返回值给ajax,seo营销教,wordpress建淘宝客网站教程,易语言取网页文本源码模块,直播平台模板lzw
  函数如何才能修改其作用域之外的变量?编写一个函数,由1~5的数字组成的数组作为参数,调用该函数后将把其中的数字项替换为相应的字符串表示形式.
多标签分类源码,ubuntu开机硬盘密码,在本地运行需要tomcat吗,pdd爬虫 2021,web平台和php哪个好用,seo网站免费lzw
需要注意知识点:

在JavaScript中函数参数的传递,对于基于原始值的参数进行值传递(数字,字符串,布尔值),函数中的修改不会影响实际参数值.而传递给函数的参数而言,对象是一个引用,对其的修改的将会反映在主调程序中.<-但是,会有这样的情况,如下

var outer_number = ;var outer_boolean = true;var outer_array = [,,];var outer_object = {test:""};function display(num,bool,arr,obj){console.log("number:"+num+"\nboolean:"+bool+"\narray:"+arr+"\nobject:"+obj.test);}function test(num,bool,arr,obj){display(num,bool,arr,obj);//num=,bool=true,array=[,,],object.test=num = ;bool = false;arr[] = ;obj.test = "";display(num,bool,arr,obj);//num=,bool=false,array=[,,,],object.test=arr = [,,];obj = {test:""};display(num,bool,arr,obj);//num=,bool=false,array=[,,],object.test=}test(outer_number,outer_boolean,outer_array,outer_object);display(outer_number,outer_boolean,outer_array,outer_object);//num = ,bool=true,array=[,,,],object.test= 
在上面代码中我们创建了4个全局变量,类型分别为数字,布尔值,数组,对象.2个函数,display和test.

display执行了4次,分别结果如下:

“number:2
boolean:true
array:1,2,3
object:122″<-传入函数时的值

“number:0
boolean:false
array:1,2,3,3
object:134″<-执行更改

“number:0
boolean:false
array:3,2,1
object:133″<-重新赋值

“number:2
boolean:true
array:1,2,3,3
object:134″<-函数执行完毕后

可以看出我们对数组和对象的重新赋值并没有成功,如果按引用传递,那么我们应该也对全局变量的数组和对象重新赋值修改了呀.
其实JavaScript中所谓的按引用赋值并不是真正意义上的按引用复制,准确说应该是按共享传递.也可以叫按对象传递,按对象共享传递(call by sharing).

在这个按共享传递的条件下,我们获取的引用可以说只是实参引用的副本,它和我们经常说的按引用传递的最大差别就在于我们在对引用副本的赋值不会影响实参的值,正如我们上面那样做的那样,赋值操作是不可行的.

当然我们从对象类型和基本类型两方面看,对象是可变的而基本类型是不可变的(注意!字符串修改其实是返回的新的字符串),所以按共享传递对于基本类型来说也是符合按共享传递的.

总结一下:

JavaScript中,基本类型和对象都按共享传递(call by sharing),但是由于JavaScript的基本类型的不变性,基本类型按共享传递与按值传递没有任何区别,而对象按共享传递.

按共享传递(call by sharing):传递的是实参引用的副本,我们对引用副本的赋值不影响实参的值,但是可以使用引用副本去修改引用的内容.详细的wiki地址

函数对传入的参数:

1.基本类型,按值传递(或者也可以说按共享传递),内部赋值修改都不影响主调程序

2.对象类型,按共享传递,传入的为实参引用的副本,内部对该引用的赋值无效,对对象属性的赋值修改有效.

大概就是这么理解了,假如有什么地方我犯了什么错误,也希望能被指出来.

下面单独拉出JavaScript作用域

任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。

全局作用域(Global Scope)

在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:

(1)最外层函数和在最外层函数外面定义的变量拥有全局作用域,例如:

var authorName="山边小溪";function doSomething(){var blogName="梦想天空";function innerSay(){alert(blogName);}innerSay();}alert(authorName); //山边小溪alert(blogName); //脚本错误doSomething(); //梦想天空innerSay() //脚本错误
  (2)所有末定义直接赋值的变量自动声明为拥有全局作用域,例如:

function doSomething(){var authorName="山边小溪";blogName="梦想天空";alert(authorName);}doSomething(); //山边小溪alert(blogName); //梦想天空alert(authorName); //脚本错误 
  变量blogName拥有全局作用域,而authorName在函数外部无法访问到。

(3)所有window对象的属性拥有全局作用域

一般情况下,window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等。

  1. 局部作用域(Local Scope)  

和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域,例如下列代码中的blogName和函数innerSay都只拥有局部作用域。

function doSomething(){var blogName="梦想天空";function innerSay(){alert(blogName);}innerSay();}alert(blogName); //脚本错误innerSay(); //脚本错误 


JavaScript修改作用域外变量办法【javascript】
  • js中块级作用域以及函数作用域之间有什么区别?(代码解析)
  • js中块级作用域以及函数作用域之间有什么区别?(代码解析) | js中块级作用域以及函数作用域之间有什么区别?(代码解析) ...

    JavaScript修改作用域外变量办法【javascript】
  • 谈一谈js中的执行环境及作用域【javascript】
  • 谈一谈js中的执行环境及作用域【javascript】 | 谈一谈js中的执行环境及作用域【javascript】 ...

    JavaScript修改作用域外变量办法【javascript】
  • javascript函数作用域学习示例(js作用域)
  • javascript函数作用域学习示例(js作用域) | javascript函数作用域学习示例(js作用域) ...