javaScript函数理解

如果学习javaScript之前已经学过其他编程语言,在学习javaScript就会和之前观念冲突。如何学接受javaScript,然后在学习其他编程语言。学习其他语言时候也是会冲突。不过其他编程语言比如C#,java 这种语言,规则更合理,更好理解,既然学javaScript,我们只需要学习不同之处牢记心中,不然就会容易出错,今天我们现象了解一下javaScript函数与c#,java不同。

参数规则

JavaScript 函数参数与大多数语言函数参数是规则不同,参数没有个数要求,没有类型要求。

javaScriptC#Java
参数类型没有要求要求要求
参数个数没有要求要求要求
重载不支持支持支持
function Add (num1,num2)
{
    return num1 + 1;
}
console.log(Add(1));//结果是2 一个参数也可以调用成功
console.log(Add("hi", 2));//结果是hi1  类型可以随便输入
console.log(Add("1", 2, 3));//结果是11  多个参数还是可以调用成功的
--------------------------------------------------------------------------------------
function Add (num1,num2,num3)
{
   return num1 + 1;
}

function Add() {

if (arguments.length == 2) {
       return arguments[0] + arguments[1];
    }
    return "sadas"; 
}

console.log(Add(1, 2));//结果是3 ,函数名称相同的,后面函数覆盖签名函数,函数所有参数都可以通过arguments对象来接受,arguments是个数组
console.log(Add());//结果是sadas ,函数名称相同的,

参数规则

ECMAScript 中所有的函数的参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就是把值从一个变量复制到另一个变量一样。基本类型值的传递如同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样。下面分开例子介绍两种不同类型为什么是按值传递。

基本类型值

本类型这个按值传递比较好理解,直接复制变量的值传递:

function addTen(num){
	num += 10;
	return num;
}
var count = 20;
var result = addTen(count);
console.log(result); // 30
console.log(count); // 20 ,没有变化哈

引用类型值

有些人认为引用类型的传参是按照引用来传的,那暂且认为他们的理解是正确的,那下面的示例结果怎么解析呢?

function setName(obj){
	obj.name = '嘉明';
	obj = new Object();
	obj.name = '庞嘉明';
}
var person = new Object();
setName(person);
console.log(person.name); // '嘉明',为啥不是'庞嘉明'呢?

如果是按照引用传的话,那么新建的对象obj = new Object()应该是指向堆内容的对象啊,那么改变它本有的name属性值应该生效,然而并没有生效。所以它也是按值传递滴。
第一步:
var person = new Object();
在这里插入图片描述
第二步:
setName(person);
把创建一个obj对象person内存空间
在这里插入图片描述
第三步:
obj.name = ‘嘉明’;
在这里插入图片描述
第四步:
在这里插入图片描述
第五步
obj.name = ‘庞嘉明’;
在这里插入图片描述
在js中所有的传递都是值传递,这个值可以是个指向引用类型的指针,所以等号并不意味着修改这个引用对象,而是切换了原来的引用关系。(第一步到三步我觉得可以算引用传递吧,只是后续obj新开辟空间,没有覆盖原来内存,所有就归类值传递,其实也不是很合理,如果完成是值传递,第三步就应该新开辟空间)

函数声明与函数表达式

解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁。解析器会率先读取函数声明,并使其执行任何代码之前可用(可以访问);至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解析

console.log(sum(10 , 10)); // 20
function sum(num1 , num2){
	return num1 + num2;
}
console.log(sum(10 , 10)); //TypeError: sum is not a function
var sum = function(num1 , num2){
	return num1 + num2;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值