函数和作用域

2016-11-22  本文已影响0人  帕西呢么

JavaScript函数是指一个特定代码块,可能包含多条语句,可以通过名字来供其它语句调用以执行函数包含的代码语句。

比如我们有一个特定的功能需要三条语句实现


statement1;
statement2;
statement3;

那么每次想实现这个功能的时候就需要写这三句话,很麻烦,我们可以把这三条语句打包为一个函数

function doSomething(){
    statement1;
    statement2;
    statement3;
}

这样每次想实现功能的时候我们就调用一下函数就可以了,调用函数通过函数名称()的形式调用

doSomething();

声明函数

ECMAScript规定了两种声明函数方式

函数声明

function functionName(){
    statement;
}

使用function关键字可以声明一个函数,看个例子

var printName = function(){
    console.log('Byron');
};

函数表达式

var printName = function(){
    console.log('Byron');
};

参数

上面定义的函数有一个缺陷,就是过于僵化,只能打印Byron,当我们希望打印Casper的时候就需要一个新的函数,这也是很复杂的,我们可以通过参数的方式来让函数能灵活一些

function printName(name){
    console.log(name);
}

printName('Byron');
printName('Casper');

可以看出我们在定义函数的时候在括号内写了个name做占位符,也就是在定义函数的时候也不知道要输出什么,用个占位符代替,在函数实际执行的时候,用真实的值替代占位符

我们说的占位符在术语上叫做形参,也就是形式参数,而在调用函数的时候传入的值叫做实参,也就是实际的参数

函数在定义的时候可以写多个参数

function printPersonInfo(name, age, sex){
    console.log(name);
    console.log(age);
    console.log(sex);
}

auguments

在函数内部,你可以使用arguments对象获取到该函数的所有传入参数

function printPersonInfo(name, age, sex){
    console.log(name);
    console.log(age);
    console.log(sex);
    console.log(arguments);
}

返回值

有时候我们希望在函数执行后给我们一个反馈,就像表达式一样,给我们个结果,我们可以通过return来实现

function fn(a, b){
    a++;
    b++;
    return a + b;
}

var result = fn(2, 3);
conslole.log(result);

这样我们就能拿到函数希望给我的反馈了,调用return后,函数立即中断并返回结果,即使后面还有语句也不再执行

其实我们不写return语句,函数也会默认给我们返回undefined

声明提前

和变量的声明会前置一样,函数声明同样会前置,如果我们使用函数表达式那么规则和变量一样

console.log(fn); //undefined

var fn = function(){}

如果我们使用函数声明的方式,那么即使函数写在最后也可以在前面语句调用,前提是函数声明部分已经被下载到本地

fn(); // "1"

function fn(){
    console.log('1');
}

作用域

作用域(scope)指的是变量存在的范围。Javascript只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。

在函数外部声明的变量就是全局变量(global variable),它可以在函数内部读取。

var v = 1;

function f(){
  console.log(v);
}

f()
// 1

在函数内部定义的变量,外部无法读取,称为“局部变量”(local variable)。

function f(){
  var v = 1;
}

v // ReferenceError: v is not defined

函数内部定义的变量,会在该作用域内覆盖同名全局变量。

var v = 1;

function f(){
  var v = 2;
  console.log(v);
}

f() // 2
v // 1
上一篇 下一篇

猜你喜欢

热点阅读