JavaScript函数定义和调用 变量作用域

本文是笔者在看廖雪峰老师JavaScript教程时的个人总结

JavaScript中函数定义可以是这样的格式

function 函数名(参数) {

函数体

}

也可以是这样的格式

var 函数名 = function (参数) {

函数体

};

关键字一:arguments

获取全部参数

只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。arguments类似Array但它不是一个Array。第一个参数是arguments[0]....[n]

关键字二:rest

获取 获取除了已定义参数之外的参数

定义函数的时候要这样写

function foo(a, b, ...rest)

如果参数正常,则rest是一个空数组

变量作用域

如果一个变量在函数体内部申明,则该变量的作用域为整个函数体,在函数体外不可引用该变量

如果两个不同的函数各自申明了同一个变量,那么该变量只在各自的函数体内起作用

由于JavaScript的函数可以嵌套,此时,内部函数可以访问外部函数定义的变量,反过来则不行

JavaScript的函数在查找变量时从自身函数定义开始,从“内”向“外”查找。如果内部函数定义了与外部函数重名的变量,则内部函数的变量将“屏蔽”外部函数的变量

变量提升

JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部

JavaScript引擎自动提升了变量的声明,但不会提升变量的赋值。

全局作用域

不在任何函数内定义的变量就具有全局作用域。实际上,JavaScript默认有一个全局对象window,全局作用域的变量实际上被绑定到window的一个属性

JavaScript实际上只有一个全局作用域。任何变量(函数也视为变量),如果没有在当前函数作用域中找到,就会继续往上查找,最后如果在全局作用域中也没有找到,则报ReferenceError错误

块级作用域

为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量(for循环中)

常量

ES6标准引入了新的关键字const来定义常量,constlet都具有块级作用域

对象的方法:

1.在一个对象方法内部,this是一个特殊变量,它始终指向当前对象。要保证this指向正确,必须使用obj.方法

2.把对象的方法放到外面定义,在内部通过一属性指向函数名。如果在外部直接调用这个函数,则this指向全局对象window。在static模式下,函数的this指向undefined,所以在static模式下,会得到一个错误

3.this指针只在对象的函数中指向对象,如果在对象的函数内的函数还是指向undefined。如果要在函数的函数中使用this,可以先声明一个that变量捕获this,在函数的函数中使用this的地方换成that

4.怎么控制函数中this指针的指向,可以使用函数自带的apply方法。它接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数。普通函数的话this指针值是null

执行格式:函数名.apply(指向的对象(或者null),[函数本身需要的参数列表以数组形式传进来])

函数也自带一个call方法,call和apply的区别在于

        • apply()把参数打包成Array再传入;
        • call()把参数按顺序传入。

5.通过apply实现装饰器。

步骤1.需要替换掉的函数也就是需要重构或者说是需要增加功能的函数fun()

var oldfun = fun;

fun = function(){

增加的功能代码

return oldfun.apply(null,arguments);

}

时间: 2024-12-26 07:28:08

JavaScript函数定义和调用 变量作用域的相关文章

JavaScript——函数定义和调用

1.定义函数 定义方式一 绝对值函数 function abs(x){ if(x>=0){ return x; }else{ return -x; } } 上述abs()函数的定义如下: function指出这是一个函数定义: abs是函数的名称: (x)括号内列出函数的参数,多个参数以,分隔: { ... }之间的代码是函数体,可以包含若干语句,甚至可以没有任何语句. 注意: 函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回.因此,函数内部通过条件判断和循环可以

JavaScript 函数定义和调用

普通的函数定义方法: function abs(x):{ if (x >= 0){ return x; }else { return -x ; } } 两种方法是等价的 var abs = function (x):{ if (x >= 0){ return x; }else { return -x ; }; arguments JavaScript还有一个免费赠送的关键字arguments,它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数.arguments类似Array但它

JavaScript 函数定义方法

JavaScript 函数定义方法. 函数声明 在之前的教程中,你已经了解了函数声明的语法 : function functionName(parameters) { 执行的代码 } 函数声明后不会立即执行,会在我们需要的时候调用到. function myFunction(a, b) { return a * b; } 分号是用来分隔可执行JavaScript语句. 由于函数声明不是一个可执行语句,所以不以分号结束. 函数表达式 JavaScript 函数可以通过一个表达式定义. 函数表达式可

C#代码与JAVASCRIPT函数的相互调用

问:1.如何在JavaScript访问C#函数?2.如何在JavaScript访问C#变量?3.如何在C#中访问JavaScript的已有变量?4.如何在C#中访问JavaScript函数? 问题1答案如下:javaScript函数中执行C#代码中的函数:方法一:1.首先建立一个按钮,在后台将调用或处理的内容写入button_click中;        2.在前台写一个js函数,内容为document.getElementById("btn1").click();        3.

实验八——函数定义及调用总结

实验八--函数定义及调用总结 1.本次课学习到的知识点: (1)void为不反回结果的函数,且void不能省略,否则默认为int,函数体中没有表达式的return语句,也可省略return. (2)不返回结果的函数在定义.调用.参数传递.函数声明上,思路与以前相同,适用于把一些确定的.相对独立的程序功能封装成函数. (3)局部变量:定义在函数的内部,且有效作用范局部变量一般定义在函数或复合语句的开始处,围局限于所在的函数内部,形参是局部变量. (4)不能定义在中间位置. (5)全局变量:定义在函

第9课 - 函数定义及调用

第9课 - 函数定义及调用 1. makefile中的函数 (1)make 解释器提供了一系列的函数供 makefile 调用 (2)在 makefile 中支持自定义函数实现,并调用执行 (3)通过 define 关键字实现自定义函数 2. 在makefile中自定义函数 (1)自定义函数的语法 其中,$(0) 代表被调用的函数名,$(1) , $(2) , $(3) ... 代表调用函数时后面的传参 (2)深入理解自定义函数 - 自定义函数是一个多行变量,无法直接调用 - 自定义函数是一种过

JavaScript函数的各种调用模式

函数是JavaScript世界里的第一公民,换句话来说,就是我们如果可以精通JavaScript函数的使用,那么对JavaScript的运用可以更游刃有余了.熟悉JavaScript的人应该都知道,同样的函数,以不同的方式调用的话,受影响最大的应该是  this .下面我们来说说JavaScript函数的各种调用模式. 一.普通函数的调用模式 所谓普通函数的调用模式,也是JavaScript函数的最简单的一种调用模式,直接就是函数名后接一个  ()  实现调用,看下面代码: function f

函数 定义与调用

为什么要用函数 函数的定义与调用 函数的返回值 函数的参数 本章小结 返回顶部 为什么要用函数 现在python届发生了一个大事件,len方法突然不能直接用了... 然后现在有一个需求,让你计算'hello world'的长度,你怎么计算? 这个需求对于现在的你其实不难,我们一起来写一下. s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) 好了,功能实现了,非常完美.然后现在又有了一个需

函数定义及调用(八)

在 makefile 中是支持函数的概念的,make 解释器提供了一系列的函数供 makefile 调用.在 makefile 中支持自定义函数实现,并调用执行:提供 define 关键字实现自定义函数.下面是自定义函数的语法 我们再来深入地看看自定义函数,自定义函数是一个多行变量,无法直接调用:其次自定义函数是一种过程调用,没有任何的返回值:自定义函数用于定义命令集合,并应用规则中.下来我们还是以代码为例来进行说明 .PHONY : test define func1     @echo "M