位置: 编程技术 - 正文

JavaScript入门之基本函数详解(javascript入门教程)

编辑:rootadmin
总的来说,函数在JavaScript中可以: ◆ 被赋值给一个变量 ◆ 被赋值为对象的属性 ◆ 作为参数被传入别的函数 ◆ 作为函数的结果被返回 ◆ 用字面量来创建 函数对象 1.1 创建函数 创建JavaScript函数的一种不长用的方式(几乎没有人用)是通过new操作符来作用于Function“构造器”: 参数列表中可以有任意多的参数,然后紧跟着是函数体,比如: 将会打印结果: 6 但是,谁会用如此难用的方式来创建一个函数呢?如果函数体比较复杂,那拼接这个String要花费很大的力气,所以JavaScript提供了一种语法糖,即通过字面量来创建函数: 或: 事实上,这样的语法糖更容易使传统领域的程序员产生误解,function关键字会调用Function来new一个对象,并将参数表和函数体准确的传递给Function的构造器。 通常来说,在全局作用域(作用域将在下一节详细介绍)内声明一个对象,只不过是对一个属性赋值而已,比如上例中的add函数,事实上只是为全局对象添加了一个属性,属性名为add,而属性的值是一个对象,即function(x, y){return x+y;},理解这一点很重要,这条语句在语法上跟: 并无二致。都是给全局对象动态的增加一个新的属性,如此而已。 为了说明函数跟其他的对象一样,都是作为一个独立的对象而存在于JavaScript的运行系统,我们不妨看这样一个例子: 没有错,p虽然引用了一个匿名函数(对象),但是同时又可以拥有属性,完全跟其他对象一样,运行结果如下: function (){ print("invoke p by ()"); } func:function invoke p by () 1.2 函数的参数 在JavaScript中,函数的参数是比较有意思的,比如,你可以将任意多的参数传递给一个函数,即使这个函数声明时并未制定形式参数,比如: 函数adPrint在声明时接受三个形式参数:要打印的串,要打印的长度,是否转换为大小写的标记。但是在调用的时候,我们可以按顺序传递给adPrint一个参数,两个参数,或者三个参数(甚至可以传递给它多于3个,没有关系),运行结果如下: Hello, world Hello hello HELLO 事实上,JavaScript在处理函数的参数时,与其他编译型的语言不一样,解释器传递给函数的是一个类似于数组的内部值,叫arguments,这个在函数对象生成的时候就被初始化了。比如我们传递给adPrint一个参数的情况下,其他两个参数分别为undefined.这样,我们可以才adPrint函数内部处理那些undefined参数,从而可以向外部公开:我们可以处理任意参数。 我们通过另一个例子来讨论这个神奇的arguments: 函数sum没有显式的形参,而我们又可以动态的传递给其任意多的参数,那么,如何在sum函数中如何引用这些参数呢?这里就需要用到arguments这个伪数组了,运行结果如下: Error: not a number exception 函数作用域 作用域的概念在几乎所有的主流语言中都有体现,在JavaScript中,则有其特殊性:JavaScript中的变量作用域为函数体内有效,而无块作用域,我们在Java语言中,可以这样定义for循环块中的下标变量: public void method(){ for(int i = 0; i < obj1.length; i++){ //do something here; } //此时的i为未定义 for(int i = 0; i < obj2.length; i++){ //do something else; } } 而在JavaScript中: JavaScript的函数是在局部作用域内运行的,在局部作用域内运行的函数体可以访问其外层的(可能是全局作用域)的变量和函数。JavaScript的作用域为词法作用域,所谓词法作用域是说,其作用域为在定义时(词法分析时)就确定下来的,而并非在执行时确定,如下例: 运行结果是什么呢?初学者很可能得出这样的答案: global local 而正确的结果应该是: undefined local 因为在函数scopeTest的定义中,预先访问了未声明的变量str,然后才对str变量进行初始化,所以第一个print(str)会返回undifined错误。那为什么函数这个时候不去访问外部的str变量呢?这是因为,在词法分析结束后,构造作用域链的时候,会将函数内定义的var变量放入该链,因此str在整个函数scopeTest内都是可见的(从函数体的第一行到最后一行),由于str变量本身是未定义的,程序顺序执行,到第一行就会返回未定义,第二行为str赋值,所以第三行的print(str)将返回”local”。 函数上下文 在Java或者C/C++等语言中,方法(函数)只能依附于对象而存在,不是独立的。而在JavaScript中,函数也是一种对象,并非其他任何对象的一部分,理解这一点尤为重要,特别是对理解函数式的JavaScript非常有用,在函数式编程语言中,函数被认为是一等的。 函数的上下文是可以变化的,因此,函数内的this也是可以变化的,函数可以作为一个对象的方法,也可以同时作为另一个对象的方法,总之,函数本身是独立的。可以通过Function对象上的call或者apply函数来修改函数的上下文: call和apply call和apply通常用来修改函数的上下文,函数中的this指针将被替换为call或者apply的第一个参数,我们不妨来看看JavaScript入门之对象与JSON中的例子: //定义一个人,名字为jack var jack = { name : "jack", age : } //定义另一个人,名字为abruzzi var abruzzi = { name : "abruzzi", age : } //定义一个全局的函数对象 function printName(){ return this.name; } //设置printName的上下文为jack, 此时的this为jack print(printName.call(jack)); //设置printName的上下文为abruzzi,此时的this为abruzzi print(printName.call(abruzzi)); print(printName.apply(jack)); print(printName.apply(abruzzi)); 只有一个参数的时候call和apply的使用方式是一样的,如果有多个参数: setName.apply(jack, ["Jack Sept."]); print(printName.apply(jack)); setName.call(abruzzi, "John Abruzzi"); print(printName.call(abruzzi)); 得到的结果为: Jack Sept. John Abruzzi apply的第二个参数为一个函数需要的参数组成的一个数组,而call则需要跟若干个参数,参数之间以逗号(,)隔开即可。 使用函数 前面已经提到,在JavaScript中,函数可以 ◆ 被赋值给一个变量 ◆ 被赋值为对象的属性 ◆ 作为参数被传入别的函数 ◆ 作为函数的结果被返回 我们就分别来看看这些场景: 赋值给一个变量: //声明一个函数,接受两个参数,返回其和 function add(x, y){ return x + y; } var a = 0; a = add;//将函数赋值给一个变量 var b = a(2, 3);//调用这个新的函数a print(b); 这段代码会打印”5”,因为赋值之后,变量a引用函数add,也就是说,a的值是一个函数对象(一个可执行代码块),因此可以使用a(2, 3)这样的语句来进行求和操作。 赋值为对象的属性: 事实上,这个例子与上个例子的本质上是一样的,第一个例子中的a变量,事实上是全局对象(如果在客户端环境中,表示为window对象)的一个属性。而第二个例子则为obj对象,由于我们很少直接的引用全局对象,就分开来描述。 作为参数传递: //高级打印函数的第二个版本 function adPrint2(str, handler){ print(handler(str)); } //将字符串转换为大写形式,并返回 function up(str){ return str.toUpperCase(); } //将字符串转换为小写形式,并返回 function low(str){ return str.toLowerCase(); } adPrint2("Hello, world", up); adPrint2("Hello, world", low); 运行此片段,可以得到这样的结果: HELLO, WORLD hello, world 应该注意到,函数adPrint2的第二个参数,事实上是一个函数,将这个处理函数作为参数传入,在adPrint2的内部,仍然可以调用这个函数,这个特点在很多地方都是有用的,特别是,当我们想要处理一些对象,但是又不确定以何种形式来处理,则完全可以将“处理方式”作为一个抽象的粒度来进行包装(即函数)。 作为函数的返回值: 先来看一个最简单的例子: 函数currying返回一个匿名函数,这个匿名函数会打印”curring”,简单的调用currying()会得到下面的结果: 如果要调用currying返回的这个匿名函数,需要这样: currying()(); 第一个括号操作,表示调用currying本身,此时返回值为函数,第二个括号操作符调用这个返回值,则会得到这样的结果: currying

推荐整理分享JavaScript入门之基本函数详解(javascript入门教程),希望有所帮助,仅作参考,欢迎阅读内容。

JavaScript入门之基本函数详解(javascript入门教程)

文章相关热门搜索词:javascript简明教程,javascript入门项目,javascript简明教程,javascript教程chm,javascript基础入门视频教程,javascript入门教程,javascript入门教程,javascript快速入门,内容如对您有帮助,希望把文章链接给更多的朋友!

JavaScript入门之事件、cookie、定时等 一篇关于JavaScript语言入门的文章涵盖了JavaScript语言中许多最基础的内容,从创建脚本标签到使用注释、把JavaScript文件包含到HTML文档中、定义变量、使

浅谈JavaScript编程语言的编码规范 JavaScript编程语言作为最流行的客户端脚本语言,早已被众多Web开发人员所熟悉。随着Web2.0时代的到来和Ajax技术的广泛应用,JavaScript也逐渐吸引着更多

JavaScript学习笔记(一) js基本语法 1.标识符与关键字标识符以字母开头,可以包含字母、数字、下划线。标识符不能使用以下保留字符:abstract,boolean,break,byte,case,catch,char,class

标签: javascript入门教程

本文链接地址:https://www.jiuchutong.com/biancheng/380546.html 转载请保留说明!

上一篇:JavaScript入门之对象与JSON详解(javascript教程chm)

下一篇:JavaScript入门之事件、cookie、定时等(javascript简明教程)

  • 出售固定资产简易计税账务处理
  • 飞机票抵扣进项税怎么计算民航发展基金
  • 营改增之前的工程造价怎么算
  • 收到境外汇款怎么处理
  • 安保公司差额征税开具发票
  • 小规模纳税人支付的增值税
  • 营改增后小规模纳税人涉税账务处理
  • 专用发票过期未抵扣怎么处理?
  • 非货币性资产交换准则
  • 上年的应收帐款在本年度如何录入?
  • 部分退货退款剩下的钱什么时候给卖家
  • 减半征收企业所得税税率
  • 未分配利润转出
  • 双倍余额递减法考虑净残值吗
  • 小规模纳税人可以开3%的专票吗
  • 选择纳税人身份考虑的因素
  • 建筑发票怎么抵税
  • 办公室设计费取费标准一览表
  • 收到个税手续费返还现金流量表
  • 亏损企业是否可以上成长板
  • 餐饮定额发票怎么征税
  • 业务招待费进项税额转出
  • 个体户没有对公账户可以转个人账户吗
  • 普通发票上个月的怎么作废
  • 印花税按含税收入还是不含税收入
  • 单位代缴纳职工个税如何账务处理
  • 境外承包工程出口货物能否办理退税?
  • 采购材料的运费怎么做分录
  • 任务栏图标重叠一起
  • 高新技术的研发收入是多少才可以提高
  • 出纳交接工作注意
  • 以前年度应付款项怎么调账
  • 脑部病毒感染什么症状
  • 公司+农户经营模式是什么意思
  • 会计月末做账
  • yolov教程
  • 委托代销商品两种方式会计分录
  • 聘用退休人员的法律风险
  • 土地增值税的计算方法和步骤例题
  • php正则表达式匹配字符串
  • 税控盘是什么样子的
  • 操作系统页表项怎么算
  • 对 ChatGLM-6B 做 LoRA Fine-tuning
  • 单文件php文件列表
  • 研发支出什么时候转管理费用
  • 增值税普通发票查询真伪
  • 地方教育附加是非税收入吗
  • phpcms程序
  • 数据库镜像是什么意思
  • sql2000日志清理
  • 会计付租金会计分录
  • 出口退的税交附加税吗
  • 应收账款未收到是否要交税
  • 工程预付款是否含规费和税金
  • 收到发票了填写什么单据
  • 公司人事怎么办公积金提取流程?
  • 应付利润属于什么科目类别
  • 建账需要准备什么东西
  • mysql官方监控工具
  • sqlserver如何查询表数据
  • xp系统玩英雄联盟出现win32
  • ubuntu16.04英文版安装教程
  • explorer.exe是啥意思
  • 新买的读卡器不读卡,提示放入驱动盘
  • cortanawin10在哪
  • win10预览版好吗
  • linux 文件执行
  • win8 u盘启动
  • WIN10系统安装.net报错0x80072f8F
  • opengl怎么导入模型
  • nodejs实战
  • javascriptweb
  • javascript实现3D切换焦点图
  • javascipt:void
  • 湖北省电子税务局新版登录操作简介
  • 律师到税务机关调取信息
  • 税务评定等级a是缴纳多少
  • 四川成都离剑门多远
  • 公租房要钱吗
  • 2021河南省中考英语听力音频
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设