问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

js函数形参和实参的区别

发布网友 发布时间:2022-04-22 16:40

我来回答

2个回答

懂视网 时间:2022-04-22 21:01

如何定义作用域链

作用域链为一个对象的列表,每次调用js函数的时候,都会创建一个新的对象来保存其局部变量,把这个对象添加到作用域链中,如果函数返回,就从作用域链中将绑定的对象删除,如果不存在嵌套函数,也不存在其引用指向这个绑定的对象,会被js解释器的垃圾回收机制不定时的回收,是不定时的,不是在没有完全引用的时候立马删除,如果定义了嵌套函数,每个嵌套函数都各自对应着一个作用域链,并且这个作用域链指向一个变量绑定的对象。如果这些嵌套函数对象在外部函数中保存下来,那么他们也会和所指向的变量绑定对象一样当做垃圾进行回收,如果这个函数定义了嵌套的函数,并将它作为返回值返回,或者存储在某处属性里,会有外部引用指向这个嵌套函数,即不会被当做垃圾回收,其变量所绑定的对象也不会当做垃圾进行回收。

函数执行完毕以后相关的作用域链不会删除,只有当不在有引用的时候,才会进行删除操作

884710466-5b4b6f3028f51_articlex[1].png

关于栈的说明

原始栈
栈顶 window
执行下列js脚本

function a() {
 function f() {
 return 333;
 }
 return f;
}
a()();

栈顶 a → window
开始调用,执行到return
发现需要调用f
继续加栈
栈顶 f → a → window
执行完f弹出f
继续执行a,执行完毕弹出a
最后全部执行完毕弹出window

算了文字解释太无力,直接上代码

var scope = "global scope"; // 一个全局变量
function checkscope() 
{
 
 var scope = "local scope"; // 定义一个局部变量
 
 function f() 
 {
 return scope; // 返回变量作用域中的scope的值
 }
 
 return f(); // 返回这个函数
}

调用一下这个函数

checkscope();
"local scope"

接着这样执行

var scope = "global scope"; // 一个全局变量
function checkscope() 
{
 
 var scope = "local scope"; // 定义一个局部变量
 
 function f() 
 {
 return scope; // 返回变量作用域中的scope的值
 }
 
 return f; // 返回这个函数
}

继续调用函数

checkscope()();
"local scope"

闭包有什么用

先看一个函数uniqueInteger()使用这个函数能够跟踪上次的返回值

var uniqueInteger = (
 function() {
 var count = 0;
 return function() {return count++}
 }()
);

这样子就使用闭包

uniqueInteger();
0
uniqueInteger();
1

每次返回是其上一次的值,并随便直接将值加1
至于为什么要这样写,如果不使用闭包,那么恶意代码就可以随便的将计数器重置了。。

uniqueInteger.count = 0;
function uniqueInteger() {
 return uniqueInteger.count++;
}

类似这样的,完全可以做到直接通过赋值,将其count的值重置。
而如果使用闭包,没有办法进行修改,为私有状态,也不会导致其一个页面内变量的冲突,或者是其覆盖。

立即调用的函数

var a = (function c(){
 var a = 1;
 a++;
 console.log('已经执行');
 return function b(){return a++};
}())

额,我大概解释一下这段代码。
首先呢,解释最外层的圆括号,因为如果没有圆括号,则这个是一个赋值语句,将一个匿名函数赋值给变量a,实际上是在内存中完成了栈中变量a指向匿名函数存储的空间的地址,如果有圆括号,实际上是告诉js解释器这是一个语句,需要js执行,消除了其function带来的影响。(ps;貌似火狐上不加也可以,也可以正常的运行)执行和引用的关系下方有。
然后呢,最后的圆括号,代表着其执行这个函数,因为js解析器将()解析为调用前方的函数名称,类似于运算符吧。但是实际上并不是运算符,因为能往其内传值,注意,这点是将其执行的结果保存在堆中,并完成其指向
其后,当直接输入a;,实际上执行并完成了一次调用,其返回值为函数b,将函数b完成一次引用,即变量a引用函数b,由于其存在引用关系,即栈中变量a保存的为其函数a的返回结果,(因为其不是不是对象,如果写a()()表示将函数a调用后返回的对象保存在栈中,然后将栈中的内容再次调用,由于是保存,并不存在其应用关系,所以执行完毕后直接垃圾回收)由于其保存的是函数b的作用域链,而函数b的作用域链是继承自函数a的作用域链,但是由于函数a的作用域链并没有引用导致其执行完后被垃圾回收(当不在有变量指向的时候)。所以呢,函数其值是在函数b中进行保存,如果修改函数c此时函数c并不会影响到函数b中的保存,因为其函数c的变量列表已被销毁,
最后,继续讨论起嵌套函数的引用,由于其父函数已被销毁,但是嵌套函数被引用,(注意:因为其父已经没有,所以是另开辟一块新的堆空间,用于存储其函数c的返回结果,注意是返回结果,而不是函数b)此时另外指定变量保存其结果,无论指定多少个变量保存其结果,都是新的空间的执行,没有任何的干扰,详细了解看下面,继续讨论

  1. ps;如果是()()则代表其会被其垃圾回收

  2. ps 还需要注意一点点的是由于其引用的是result的值,并不是其

最后,这样就能完成其变量保存在函数中,貌似叫做记忆?

所以呢,借助堆和栈就很好的能理解了闭包

再继续看代码

function count() {
 var n = 0;
 return {
 count: function() { return n++; },
 reset: function() { n = 0; }
 };
}
var c = count(); var d = count();
undefined

在分别执行一下下

c.count();
0
d.count();
0
c.count();
1
d.count();
1
c.reset();
undefined
c.count();
0
d.count();
2

这一点体现了其互不影响性,表明其由于其父被回收,导致其子分别开创了一块在堆中新的内存空间,并完成其指向,互相不干扰。
其作用域链互不干扰

使用getter和setter完成其闭包

function count(n) {
 return {
 get count() { return n++; },
 set count(m) { 
 if ( m >= n)
 n = m;
 else
 throw new Error( '请输入一个正确的值' );
 },
 };
}

这个就不用解释啦,很简单啦

同一个作用域链中定义两个闭包

function test1() {
 val = value = 111;
 this.test = function() { return value - 1; };
 this.test2 = function() { return value + 1; };
 
}

这同样是两个作用链域
不过这样写需要先执行其o.test1(),因为其方法在其函数内部,必须先执行一下,完成其方法的添加,否则会报错,

ee.test is not a function

提示找不到这个方法,
因为执行

ee.test1 = test1;
function test1()

只是简单的进行赋值,并不能进行查看,所以导致其无法使用
所以嘛,要先执行一遍,让其方法添加进去

ee.test1();
undefined
ee.test();
110
ee.test2();
112

这就是两个闭包,这两个闭包互相平行,同时继承于其父,但是又不受其父影响,很神奇吧,(@ο@)

叮 又发现一个莫名奇妙的东东 https://us.leancloud.cn 貌似目前水平能看懂一些了

关于this的问题

this在父闭包显示的即为使用该方法的对象。
但是子就不一定了。

function test1() {
 val = value = 111;
 this.test = function() { return this.x - 1; };
 this.test2 = function() { return this.x + 1; };
}

执行一下

ee.test();
4443

这就尴尬了。
好吧。只能说是一般不这样用
一般这样写

var self = this;

将其值保存进一个self中

热心网友 时间:2022-04-22 18:09

function test(形参){//定义函数时的参数叫做形参,如字面意思形式上的参数并非真的是本身
alert(形参)
}
test(实参)//调用时给的参数称为实参 就是说真正的参数
想小学数学一样设一个未知数X 至于X到底为多少是我们给的算
在这里我在附张图 你参考理解

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
单机组装6000元预算,INTEL和AMD下不同的配置方案 手上有5000元,想DIY一台台式机,主要是玩大型单机游戏,像孤岛危机2。求... ...及各自优点缺点和如何修改。。 CPU 至强 E3 1230 v2主板 微星Z... 求配家用游戏电脑4000-6000 嘴巴上长水泡怎么办? 嘴巴旁边长了水泡怎么回事 他不回信息的句子 市面上有哪些浪漫又个性的牛仔单品值得入手? 2021年流行什么外套显瘦不挑身材 夏季有哪些百搭又显高级的单品值得选择? 我的小米电视3s 43寸黑屏了怎么办 有部蓝牙耳机,带麦克的。我想把它当作台式电脑耳机用,请问怎么实现用蓝牙耳机语音聊天 同时不影响电脑 教室里有麦克风影响蓝牙耳机吗 四川大学什么专业考研可考口腔医学?口腔医学技术和口腔数字化技术双学位可以考口腔医学临床吗?_百度问一问 有了解隐形正畸数字化口腔医疗应用流程的吗? 跆拳道的坏处 导热硅胶垫片如何计算成本 硅胶按键怎样核算成本 空之境界问题 如何计算硅胶的重量和成本 kalafina与梶浦由记合作的动漫歌曲 水木属性的行业有哪些? 五行属木一定要从事属木的行业吗 空之境界第四部 求《剧场版 空之境界 第一章:俯瞰风景》背景音乐? 木属性行业 空之境界剧场版第三痛觉残留 手机像素不好,加个镜头有用吗? 空之境界一样的轻小说 空之境界 小说 完整版 pdf格式 全国计算机软件专业技术资格(水平)考试有几个级别? 阿斯顿少儿英语一个课时上多久? 阿*斯*顿少儿英语有什么比较经典的特色课程吗?麻烦介绍一下,谢谢。 唐山有没有阿斯顿英语学校啊?我想让儿子也去! 襄阳天使教育阿斯顿英语怎么样? 林志玲的演技水平如何? 联想笔记本g456c参数 在使用ise软件时,源文件窗口中xc3s100e4cp132的含义是什么 没有抽象方法的抽象类有什么意义 抽象类存在的意义是什么,一般类完全可以代替它 抽象类的运用意义 面向对象思想中的抽象类的为了什么而采用的呢?存在的意义是什么? java中没有抽象方法的抽象类有什么意义 为什么抽象类继承实体类前提是实体类必须有明确的构造函数? 大米对人体的害处 js实参和形参的区别 “月饼”的名称由来是从唐朝开始的吗 防晒是牛仔服防晒还是卫衣防晒 佛山市黄飞鸿国际武术学校怎么样? 汽修厂怎样谈大单