Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript函数(类比php)

JavaScript函数(类比php)

作者头像
王中阳Go
发布于 2022-10-26 05:51:16
发布于 2022-10-26 05:51:16
39000
代码可运行
举报
文章被收录于专栏:Go语言学习专栏Go语言学习专栏
运行总次数:0
代码可运行

默认参数

和php中一样,还没有一种语法允许一个函数参数带有默认值。(咱们可以这么玩)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function sum(a,b){
    b = typeof b === "undifine" ? 2 : b;
    return a + b;
}

sum(3,0); //3
sum(3); //5

任意多个参数

js对函数的参数要求不严格,不一定非要传递指定个数的参数 多余的参数会被忽略掉,看下面的例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sum();//NaN
sum(1,2);//3
sum(1,2,100,300);//3

在php中,用func_get_args(),它返回传递给函数的参数的一个数组。 arguments(技术拔高)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function sum(){
    for(var i = 0,result = 0;i < arguments.length; i++){
        result += arguments[i];
    }
    return result;
}

sum();//0
sum(1);//1
sum(1,2);//3
sum(1,2,3);//6
sum(1,2,3,4);//10
sum(1,2,3,4,5);//15

argumetns尽管看上去像数组,但实际上是一个对象,没有诸如push(),pop()这样的数组方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function sum(){
    var args = Array.prototype.slice.call(arguments);
    var a = typeof arguments.push;
    var b = typeof args.push;
    console.log(a); //undefine
    console.log(b); //function
}

sum();
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
slice() 方法可从已有的数组中返回选定的元素
prototype 属性使您有能力向对象添加属性和方法。

arguments.length的技巧

聪明的方法实现带默认值的函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function sum(a,b,c,d){
    switch(arguments.length){
        //注意:都不加break
        case 0: a=1;
        case 1: b=2;        
        case 2: c=3;        
        case 3: d=4;        
    }
    return a+b+c+d;
}

sum();//10
sum(1);//10
sum(11);//20
sum(11,22);//40

返回值

js的函数总是会返回一个值。如果一个函数不使用return语句,那么会隐式的返回值undefine

函数是对象(重点)

JavaScript中的函数是对象,理解这一点非常重要。它们带有自己的属性和方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function sum(a,b){ 
    return a + b;
}

sum.length; //2 -->该函数的参数个数

函数对象的call()和apply()方法,提供了调用该函数的一种替代方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sum.call(null,2,3);//5
sum.apply(null,[2,3]);//5 apply()接收的参数以数组的方式传递

类似于我们php中的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
call_user_func('sum',2,3);
call_user_func_array('sum',array(2,3));

php语法详解

不同的语法

函数表达式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var sum = function(a,b){
    return a+b;
};

sum(1,2); //3

这种语法展示了所谓的函数表达式(function expression),这和我们所熟悉的另一种叫做函数声明(function declaration)语法不同。 根据上下文环境的不同,function关键字具有不同的语句含义。在函数表达式中,它是一个操作符。在函数声明中,它是一条语句。

注意:函数表达式末尾必须加分号。函数声明则不是必须的。

函数声明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function sum(a,b){
    return a+b;
}

sum(1,2); //3

命名函数表达式(named function expression)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var sum = function sum(a,b){
    return a+b;
}

sum.name; //sum

var sum = function(a,b){
    return a+b;
}

sum.name; //""

主要用于调试

作用域

javascript中没有块作用域,只有函数作用域。 在一个函数中定义的任何变量,对于函数来说都是局部的,而且无法在函数之外看到它。 全局变量是那些在任何函数之外定义的变量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if(true){
    var true_global = 1;
}

if(false){
    var false_global = 1;
}

function sum(){
    var local = 1;
    is_local = 1;
    return true_global+local+is_local;
}

console.log(true_global);//1
console.log(false_global);//undefined
console.log(local); //ReferenceError: local is not defined
console.log(is_local); //ReferenceError: is_local is not defined

sum();

console.log(true_global);//1
console.log(false_global);//undefined
console.log(local); //ReferenceError: local is not defined
console.log(is_local);//1 is_local漏掉了var,全局命名空间被污染

总结

true_global总是可用的 即使是在一段不会执行的代码块中,false_global也总是声明了的,尽管没有初始化。使用它将会返回undefined(所有变量的默认值),这并不是错误。 在函数sum()之外,local是不可用的,他是该函数的局部变量。试图在其局部作用域之外使用它,会产生错误。 在使用sum()函数之前,is_local还没有声明,这将会导致错误;调用sum()会给is_local分配一个值。因为漏掉了var语句,会将这个值放到全局作用域中。开发中要避免这样做:防止全局命名空间被污染。

提升

当程序进入到一个新的作用域(例如,在一个新函数,全局作用域或eval()中),在函数中任何地方所定义的所有变量都移动或提升(hoisted)到作用域的顶层。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var a = 1;
function hoistingTest(){
    console.log(a);
    var a = 2;
    console.log(a);
}

hoistingTest(); //先显示"undefine" 再显示2

解释一下原因:局部变量var a = 2;的声明提升到了顶层,重点是只有声明被提升,但是赋值没有被提升到作用域的顶层。真相是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function hoistingTest(){
    var a;
    console.log(a);
    a = 2;
    console.log(a);
}

如何规避这种问题: 在顶部声明所有变量(可以看做类似定义一个php类并且所有属性都放到类的顶部,而不是散乱到方法里) 在需要的变量的时候才去定义它 延伸,eval()eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码

提升函数

函数只是分配给一个变量的对象,所以,函数也可以得到提升。但是,因为函数定义方法的不同,提升方式会有所区别。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//全局作用域
function declare(){} 
var express = function(){};

(function(){
    //局部作用域
    console.log(typeof declare);//function
    console.log(typeof express);//undefine

    function declare(){}
    var express = function(){};

    console.log(typeof declare);//function
    console.log(typeof express);//function
}());

原理非常的简单,和变量的提升是一个道理:函数表达式express()只有var得到了提升。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(function(){
    var express = undefined;

    //局部作用域
    console.log(typeof declare);//function
    console.log(typeof express);//undefined

    function declare(){}
    express = function(){};

    console.log(typeof declare);//function
    console.log(typeof express);//function
}());
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员升级打怪之旅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JavaScript 模式》读书笔记(4)— 函数1
  从这篇开始,我们会用很长的章节来讨论函数,这个JavaScript中最重要,也是最基本的技能。本章中,我们会区分函数表达式与函数声明,并且还会学习到局部作用域和变量声明提升的工作原理。以及大量对API、代码初始化、程序性能等有帮助的模式。
zaking
2020/03/26
4430
JavaScript函数(二)
在前面我们已经对函数作了简单的介绍,比如函数的定义、函数的声明、函数的调用和函数的传参等。本节将进一步介绍函数的应用,深度理解函数的各种使用。 函数是一个对象,每个函数时Function类型的一个实例,与其他引用类型一样有属性和方法。由于函数时对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。函数通常是函数声明语法定义的。 function sum(x,y){ return x+y; } 上面使用函数声明语法定义的。
水击三千
2018/02/27
7030
JavaScript函数及其prototype
函数可以通过声明定义,也可以是一个表达式。 (1)函数声明式: 分号是用来分隔可执行JavaScript语句,由于函数声明不是一个可执行语句,所以不以分号结束。
奋飛
2019/08/15
4370
JavaScript模式 读书笔记三
函数是第一类对象 first-class object,可以作为带有属性和方法的值以及参数进行传递。
lilugirl
2019/05/28
3530
稳扎稳打JS——执行上下文
上下文环境的初始化在代码执行前完成 JS有三种作用域:全局作用域、函数作用域、eval作用域(不常用,不做介绍)。 在JS代码执行前,首先会对这三种作用域进行上下文环境的准备工作,准备内容如下: 全局作用域的上下文准备工作 将全局变量设为undefined 将函数表达式的值设为undefined 为函数声明直接赋值 将window对象赋给this 函数作用域的上下文准备工作 确定自由变量的作用域 为函数的参数和arguments对象赋值 将局部变量的值设为undifined 将函数表达式的
大闲人柴毛毛
2018/03/09
1.2K0
javascript 函数详解
一、函数的一些基础概念: 1.js中的函数使用function来声明。 2.关于return: 2.1  函数在执行到return语句后悔立即停止并退出,return后面的代码永远不会得到执行; 2.2  函数不必指定是否返回值,只要return语句后跟要返回的值即可实现返回值; 2.3  return语句不带任何返回值时,会返回undefined值,这种做法一般用在需要提前停止函数执行而又不需要返回值的情况。 3.理解参数: 3.1  函数不介意传递进来参数个数以及类型,因为js中的参数在内部是用一个数组
柴小智
2018/04/10
9430
探索JavaScript函数---基础篇
函数可以把具有相同或相似逻辑的代码“包裹”起来,通过函数调用执行这些被“包裹”的代码逻辑,这么做的优势是有利于精简代码方便复用。
P_M_P
2024/06/02
1960
探索JavaScript函数---基础篇
函数声明与函数表达式
定义一个函数的方法主要有三种 函数声明、函数表达式、new Function构造函数,函数声明与函数表达式定义的函数较为常用,构造函数的方式可以将字符串定义为函数。
WindRunnerMax
2020/08/27
6240
啊,函数呐!!!
一份需要你补充完整的函数导图!我还是一个初学者,这篇文章是我所知道的所有关于函数的知识,如有不完善或者错误,希望能够在评论下方指出,哈哈哈,大神勿喷。
sunseekers
2018/10/31
9380
JavaScript Scoping and Hoisting
当然,上面的代码会让浏览器弹出“1”。那么这中间究竟发生了什么?虽然这看起来似乎让人感到陌生,危险,困惑,但是这就是JavaScript语言的强大并富有表现力的特征。我不知道对这个特殊的行为是否有标准的名称,但是我喜欢用“hoisting”来标识它。这边文章将会尝试揭示为什么会这样,但是我们先要绕个路,来了解下JavaScript的作用域(scoping)。
lesM10
2019/08/26
6020
Web前端学习 第3章 JavaScript基础教程6 函数基础
函数是一个可执行的语句块,定义的时候不执行,调用的时候执行,使用"函数名()"的形式可以调用函数, 语法如下所示:
学习猿地
2020/06/16
3900
《你不知道的JavaScript》:作用域提升
所谓声明,包括变量声明和函数声明。而声明提升,就是在作用域范围内,不管内部的变量与函数声明在何处,当执行到这个作用域时,引擎都会首先将当前作用域内的变量和函数声明放置到当前作用域顶端后,再按从上到下顺序执行其他代码。举例:
前端_AWhile
2019/08/29
6760
js基础知识
最主要区别是函数名称 在函数表达式中可省略函数声明,从而创建匿名函数
星辉
2019/01/15
5810
JavaScript(五):函数(闭包,eval)
1.函数的申明:三种方法: function命令 函数表达式:变量赋值 Function构造函数 1 //method 1: function命令 2 function test(){ 3 console.log('hello function'); 4 } 5 6 //method 2:函数表达式,赋值给变量 7 var test1=function(){//这是个匿名函数 8 console.log('hello function1'); 9 };//注意这里有分号
用户1149564
2018/01/11
1.5K0
JavaScript(五):函数(闭包,eval)
前端架构师进阶之路07_JavaScript函数
相当于将一条或多条语句组成的代码块包裹起来,在使用时只需关心参数和返回值,就能完成特定的功能,而不用了解具体的实现。
张哥编程
2024/12/13
2440
前端架构师进阶之路07_JavaScript函数
js函数、作用域和闭包
2.1 用function命令声明函数 function命令后面是函数名,函数名后面是一对圆括号,里面是传入函数的参数,函数体放在大括号里面
bamboo
2019/01/29
1.5K0
js函数、作用域和闭包
javascript函数
JavaScript中的函数可以分为两类:有名函数与匿名函数。而定义函数的方式有两种:函数声明与函数表达式。
踏浪
2019/07/31
8240
一篇文章带你了解JavaScript中的函数表达式,递归,闭包,变量,this对象,模块作用域
它的一个重要特点就是:函数声明提升,就是在执行代码前先读取函数声明,可以把函数声明放在调用它的语句后。
达达前端
2020/01/02
7340
javascript中function用法_年终总结反思不足之处
整理了JavaScript中函数Function的各种,感觉函数就是一大对象啊,各种知识点都能牵扯进来,不单单是 Function 这个本身原生的引用类型的各种用法,还包含执行环境,作用域,闭包,上下文,私有变量等知识点的深入理解。
全栈程序员站长
2022/09/20
6400
JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象
一、闭包(Closure) 1.1、闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9;方法:找到所有的div,
张果
2018/01/04
1.7K0
JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象
相关推荐
JavaScript 模式》读书笔记(4)— 函数1
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验