详解JavaScript的函数简介

目录
  • 函数简介
    • 函数function
  • 创建函数
    • 构造函数创建函数
    • 函数声明创建函数
    • 函数表达式创建函数
  • 函数的参数
    • 形参(形式参数):
    • 实参(实际参数):
  • 函数的调用
  • 通过对象调用
  • new调用
  • 函数的返回值
  • 立即执行函数
  • 方法
  • 枚举对象中的属性:
  • 作用域
    • 全局作用域
    • 函数作用域
    • 块级作用域
  • 总结

函数简介

函数function

  • 函数也是一个对象
  • 函数是实现功能的n条语句的封装体,需要的时候就可以随时调用
  • 函数可以执行的,其他类型的数据不能执行
  • 使用typeof检查一个函数对象时,会返回function

优点:

  • 提高代码的复用
  • 便于阅读交流

创建函数

构造函数创建函数

语法

var fun =new Function(代码块);

这种形式构建函数的比较少。

函数声明创建函数

语法:

function 函数名(形参1,形参2......形参N){
    语句...
}

函数表达式创建函数

var 函数名 = function 函数名(形参1,形参2......形参N){
    语句...
}

函数的参数

形参(形式参数):

  • 在函数中的()中指定一个或多个形参
  • 多个形参之间使用,隔开,声明形参就相当于在函数内部声明了对应的变量,但是并不赋值

实参(实际参数):

  • 在调用函数时,可以在()中指定实参
  • 实参将会赋值给函数中相应的形参
  • 调用函数时,解析器不会检查实参的类型(所以要注意,是否有可能会接受到非法的参数,如果有可能则需要对参数进行类型检查)
function sum(a, b) {
    console.log(a + b);
}
sum(1, 2);//调用函数,传入实参

参数的数量:

  • 函数的实参和形参的个数可以不同
  • A、实参的个数多于形参的个数:函数正常运行,多余的实参被忽略
  • B、实参的个数少于形参的个数: 多余的形参会变成undefined的变量

问题: 在JavaScript中调用函数时传递变量参数时,是值传递还是引用传递?

  • 理解1:都是值(基本/地址值)传递
  • 理解2:可能是指传递,也可能是引用传递(地址值)
var a = 3;
function fn(a) {
    a = a + 1;
}
fn(a);
console.log("a为:", a);// 3

在这里就可以理解为是值(基本)传递

var obj = { name: "心猿" };//声明一个对象
function fn(obj) {
    console.log(obj.name);
}
fn(obj);//“心猿”
//这里可以理解为地址值传递,也可以理解为引用传递(地址值)

函数的调用

直接调用:

函数名()

function fn(obj) {
    console.log("我是直接被调用的!");
}
fn()//直接调用

通过对象调用

obj.函数名()

Obj = {
    fun(){
        console.log("我是通过对象调用的!");
    }
}
Obj.fun();//通过对象调用函数

new调用

new fun()

function fun() {
    console.log("我是通过new调用的!");
    return 1 + 2;//返回一个值
}
var result = new fun();
console.log("result:", result);//fun {}
console.log("result的数据类型:",typeof result);//"object"

注意:

1、用new调用的函数,得到的永远是一个对象,不管函数有没有返回值

2、使用new调用函数,这个函数就是一个用来创建对象的函数(构造函数)

fun.call/apply(obj)调用

这个是临时让fun成为obj的方法进行调用

var obj = { name: "心猿" };//声明一个对象
function fun() {
    this.age = 5000;
    console.log("通过fun.call(obj)调用函数!");
}
//不能直接通过obj.fun()调用,但是可以通过fun.call(obj)进行调用
fun.call(obj)//相当于obj.fun
//打印通过fun.call(obj)调用函数!
console.log("还可以当做obj的方法调用age的信息  "+"age:",obj.age);//5000

函数的返回值

函数可以有返回值,也可以没有返回值。

  • 有返回值的函数:函数体中通过return语法返回一个值,这个决定程序下一步操作
  • 无返回值的函数:函数只实现某种功能,不需要返回值(函数体中没有return语句)
  • 返回值可以是任意数据类型,可以是基本数据类型,也可以是对象和函数。

立即执行函数

函数定义完,立即被调用,这种函数叫做立即执行函数

立即执行函数往往只会执行一次。

语法:

(function(){
	代码块;
})();

例如:

(function (a, b) {
    console.log("num:", a + b);
})(1,3);//4

方法

  • 对象中属性可以是一个函数
  • 如果一个函数作为一个对象的属性保存。那么我们称这个函数是这个对象的方法
  • 调用这个函数就是调用对象的方法(method),本质上和函数没有区别
var obj = new Object()
{
    obj.name = "心猿";
    obj.age = 3000;
    obj.sayName = function(){
        console.log("name:",obj.name);
    }
}
obj.sayName();

另一种写法:

var obj = {
    name: "意马",
    age: 3000,
    sayName: function () {
        console.log("name:", obj.name);
    }
}
obj.sayName();

枚举对象中的属性:

可以看我这篇的不同方法遍历的区别:比较JavaScript中for、forEach、for…in、for…of的区别

使用for...in语句

语法

for(var index in arr)
{
    console.log(index);//代码块
}

for ...in语句 对象有几个属性,循环体就会执行几次,每次执行时,会将对象中的一个属性的名字赋值给变量

var person = {
    name:"孙悟空",
    age:5777,
    gender:"男"
};
for(var index in person)
{
    console.log(person[index]);
}

作用域

作用域指一个变量的作用范围

在JavaScript中一共两种作用域:

1.全局作用域(全局变量)

2.函数作用域(局部变量)

3.块级作用域ES6语法

全局作用域

  • 在函数外部定义的变量或在函数内部没有使用var声明的变量。
  • 全局作用域在浏览器页面打开时创建,在页面关闭是销毁
  • 在全局作用域中有一个全局对象window
  • 它代表的是一个浏览器的窗口
  • 它代表的是一个浏览器的窗口,它由浏览器创建我们可以直接使用
  • 如果在node.js环境下使用这个全局对象window会报错,需要在浏览器中才会有显示结果。
  • 在全局作用域中:
    • 创建的变量都会作为window对象的属性保存
    • 创建的函数都会作为window对象的方法保存
  • 全局作用域中的变量都是全局变量
  • 在页面任意的部分都可以访问的到

变量作为window对象的属性保存

var  a = 10;
console.log("a:",a);
console.log("window.a:",window.a);

因为环境的原因在node.js下会报错

在浏览器中会正常显示

函数都会作为window对象的方法

function fun(){
   console.log("我是window.fun函数!")
}
window.fun();

函数作用域

  • 调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
  • 每调用一次函数就会创建一个新的函数作用域,他们之间是互相独立的
  • 在函数作用域中可以访问到全局作用域的变量
  • 当函数作用域操作一个变量时,会现在自身作用域中寻找,如果有就直接使用,如果全局作用域中依然没有找到,则会报错ReferennceError
  • 在函数中要访问全局变量可以使用window对象

块级作用域

ES6(ECMAScript 2016)使用let声明的变量,作用范围在语句块中

for(let i=0;i<100;i++){
			}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • JavaScript CollectGarbage函数案例详解

    首先看一个内存释放的实例: <SCRIPT LANGUAGE="JavaScript"> <!-- strTest = "1"; for ( var i = 0; i < 25; i ++ ) { strTest += strTest; } alert(strTest); delete strTest; CollectGarbage(); //--> </SCRIPT> CollectGarbage,是IE的一个特有属性,用

  • JavaScript函数之call、apply以及bind方法案例详解

    总结 1.相同点 都能够改变目标函数执行时内部 this 的指向 方法的第一个参数用于指定函数执行时内部的 this 值 支持向目标函数传递任意个参数 若不向方法的第一个参数传值或者传递 undefined.null,则在 JavaScript 正常模式下,目标函数内部的 this 指向 window 对象,严格模式下,分别指向 undefined.null. 2.区别 apply() 方法可接收两个参数,而 call() 和 bind() 方法则可接收多个参数. apply() 方法向目标函数

  • JavaScript基础系列之函数和方法详解

    目录 一.函数和方法的区别 二.如何写好一个函数 2.1 命名准确 2.1.1 函数命名 2.1.2 参数命名 2.2 函数注释 2.2.1 参数注释 2.3  函数参数 2.3.1 参数默认值 2.3.2 对象参数 2.3.3 参数数量 2.3.4 参数类型防御 2.4 函数的返回 2.4.1 幂等函数 2.4.2 纯函数 2.4.3 return null 函数和方法的区别 总结 一.函数和方法的区别 函数(function):函数是带有名称和参数的 JavaScript 代码段,可以一次定

  • JS 箭头函数的this指向详解

    箭头函数是ES6中的新增特性,他没有自己的this,其this指向从外层代码库继承. 使用箭头函数时要注意一下几点: 箭头函数不能用作构造函数,用的话会抛出一个错误 无法使用arguments参数,如果要用的话就用rest 无法使用yield命令,所以箭头函数无法用作Generator函数 因为没有自己的this,所以没法通过bind.call.apply来改变this指向 但是这不代表箭头函数的this指向是静态的,我们可以通过改变它外层代码库的this指向来控制 箭头函数的this从外层代码

  • Vue.js之render函数使用详解

    Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript的完全编程的能力,这就是 render 函数,它比 template 更接近编译器. 在 HTML 层, 我们决定这样定义组件接口:通过传入不同的level 1-6 生成h1-h6标签,和使用slot生成内容 <div id="div1"> <child :level="1">Hello world!</child

  • JavaScript  函数语法详解

    目录 一.普通函数 二.箭头函数 三·.数据包 JSON 四.对象Object 五.Promise 六.Async : Await 七.包 总结 一.普通函数 js的函数创建比较特殊,有很多种方式,最简单的一种和c语言类似. 特点: 函数名字可以除了字母.数字.下划线外,还可以存在 "$" 字符. 在js中,函数名就是一个储存函数对象的变量.使用 typeof 关键字可以查看函数类型.(这个理念和python类似,可以用其他变量接手这个函数) 函数形参定义时不需要写关键字:var.le

  • 详解JavaScript的函数简介

    目录 函数简介 函数function 创建函数 构造函数创建函数 函数声明创建函数 函数表达式创建函数 函数的参数 形参(形式参数): 实参(实际参数): 函数的调用 通过对象调用 new调用 函数的返回值 立即执行函数 方法 枚举对象中的属性: 作用域 全局作用域 函数作用域 块级作用域 总结 函数简介 函数function 函数也是一个对象 函数是实现功能的n条语句的封装体,需要的时候就可以随时调用 函数可以执行的,其他类型的数据不能执行 使用typeof检查一个函数对象时,会返回funct

  • 详解JavaScript匿名函数和闭包

    概述 在JavaScript前端开发中,函数与对其状态即词法环境(lexical environment)的引用共同构成闭包(closure).也就是说,闭包可以让你从内部函数访问外部函数作用域.在JavaScript,函数在每次创建时生成闭包.匿名函数和闭包可以放在一起学习,可以加深理解.本文主要通过一些简单的小例子,简述匿名函数和闭包的常见用法,仅供学习分享使用,如有不足之处,还请指正. 普通函数 普通函数由fucntion关键字,函数名,() 和一对{} 组成,如下所示: function

  • 详解JavaScript自定义函数

    一.定义方法:在Javascript中必须用function关键字 function funcName(arg1,arg2...) { statements; return "变量值"; //返回值可以根据函数的需要 } 函数名是函数自身的一个引用.此种方式创立的函数引用是独立存在的,无法删除. 1.调用函数:函数名(参数列表). 传递的参数不必与函数定义的参数个数一致,并且可以设定函数参数的默认值. function example(a,b){ var a = arguments[0

  • 详解JavaScript Alert函数执行顺序问题

    目录 问题 分析 解决 替换 Alert() 函数 setTimeOut函数 小结 问题 前几天使用 JavaScript 写 HTML 页面时遇到了一个奇怪的问题: 我想实现的功能是通过 confirm() 弹窗让用户选择不同的需求,每次选择后都将选择结果暂时输出到页面上,最后一次选择结束后再一次性将选项传到后端处理. 代码类似于: var step1 = confirm("exec step1?"); $('#result').html($('#result').html() +

  • 详解JavaScript节流函数中的Throttle

    首先我们来了解下什么是Throttle 1. 定义 如果将水龙头拧紧直到水是以水滴的形式流出,那你会发现每隔一段时间,就会有一滴水流出. 也就是会说预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期. 接口定义: * 频率控制 返回函数连续调用时,action 执行频率限定为 次 / delay * @param delay {number} 延迟时间,单位毫秒 * @param action {function} 请求关联函数,实际应用需要调用的函数 *

  • 详解JavaScript 高阶函数

    高阶函数简介 高阶函数 的英文名叫 Higher-Order Function ,是 函数式编程 中的一种.他的表现形式往往是通过把函数作为参数传入另一个函数,或者将函数作为另一个函数的返回值返回.在实际开发业务中, 高阶函数往往可以抽象我们的代码 ,将我们的命令式编程转换为复用性更高级的函数式编程,从而 提升我们的代码质量 . 下面拿3个面试中常问的高阶函数举例子,希望看完以后能够提升大家对JS的理解,提高我们的代码质量. chat is cheap,show you my code~ Arr

  • 详解Javascript 中的 class、构造函数、工厂函数

    到了ES6时代,我们创建对象的手段又增加了,在不同的场景下我们可以选择不同的方法来建立.现在就主要有三种方法来构建对象,class关键字,构造函数,工厂函数.他们都是创建对象的手段,但是却又有不同的地方,平时开发时,也需要针对这不同来选择. 首先我们来看一下,这三种方法是怎样的 // class 关键字,ES6新特性 class ClassCar { drive () { console.log('Vroom!'); } } const car1 = new ClassCar(); consol

  • 详解JavaScript什么情况下不建议使用箭头函数

    目录 this指向原理 问题的由来 内存的数据结构 函数 环境变量 箭头函数的缺点 不适用的场景 总结 箭头函数作为ES6新增的语法,在使用时不仅能使得代码更加简洁,而且在某些场景避免this指向问题.但是箭头函数不是万能的,也有自己的缺点以及不适用的场景,虽然可以解决this只想问题,但是也可能会带来this指向问题.具体场景具体分析,本文就深入探讨箭头函数. 箭头函数没有自己的this,其this取决于上下文中定义的this. this指向原理 问题的由来 学懂 JavaScript 语言,

  • 详解JavaScript中的箭头函数的使用

    目录 前言 箭头函数语法 无圆括号语法 隐式返回 注意隐式返回错误 无法命名箭头函数 如何处理this关键字 匿名箭头函数 不正常工作的情况 箭头函数作为对象方法 箭头函数与第三方库 箭头函数没有arguments对象 总结 前言 本文可以让你了解所有有关JavaScript箭头函数的信息.我们将告诉你如何使用ES6的箭头语法,以及在代码中使用箭头函数时需要注意的一些常见错误.你会看到很多例子来说明它们是如何工作的. JavaScript的箭头函数随着ECMAScript 2015的发布而到来,

  • 详解javascript中的Strict模式

    简介 在ES5中,引入了strict模式,我们可以称之为严格模式.相应的sloppy mode就可以被称为非严格模式. 严格模式并不是非严格模式的一个子集,相反的严格模式在语义上和非严格模式都发生了一定的变化,所以我们在使用过程中,一定要经过严格的测试.以保证在严格模式下程序的执行和非严格模式下的执行效果一致. 使用Strict mode strict mode会改变javascript的一些表现,我们将会在下一节中进行详细的讲解. 这里先来看一下,怎么使用strict mode. Strict

随机推荐