JavaScript-函数

JavaScript有函数作用域和全局作用域。

var a = 1;   //a属于全局作用域

function foo()
{
    var b = 0;  //b属于函数作用域
}

C++语言中变量必须声明后使用,对js语言来说不是必须的。JavaScript引擎的工作方式是先解析代码,提取声明的变量。这叫做变量提升。

console.log(a);    //成功打印1,因为变量提升
var a = 1;

foo();  //成功调用,因为函数名也是变量名,也会被提升。
function foo(){}

变量提升仅在当前作用域有效

function foo(){
    console.log(x);  //打印1,x被提升到了当前函数作用域的顶部
    var x = 1;
}
console.log(x);  //报错,全局作用域访问不到

和普通变量一样,函数也有自身作用域,其决定于声明时所在的作用域。

var a = 1;
var x = function () {
  console.log(a);  //函数当前所在作用域 a = 1
};

function f() {
  var a = 2;  //新的作用域 a = 2
  x();
}

f() //1

阮一峰谈闭包,首先从语法入手。如何在外部获取函数内部的状态?

function foo(){
    var n=999;
}
console.log(n); // error,无法获取。


//解决办法
function f1(){
  var n=999;
  function f2(){  //通过声明f2保存f1的内部状态,因为函数声明时有自身的作用域
    console.log(n);
  }
  return f2;  //返回,这样外部就能获取到函数内部的状态
}

闭包简单理解成"定义在一个函数内部的函数",闭包最大的特点,就是它可以“记住”诞生的环境,比如f2记住了它诞生的环境f1,所以从f2可以得到f1的内部变量。

闭包的用途:1.让变量保存在内存中 2.封装对象的私有属性和私有方法
3.回调嵌套

//用途1
function createIncrementor(start) {
  return function () {
    return start++;
  };
}

var inc = createIncrementor(5);

inc() // 5
inc() // 6
inc() // 7

//用途2
function Person(name) {
  var _age;
  function setAge(n) {
    _age = n;
  }
  function getAge() {
    return _age;
  }

  return {
    name: name,
    getAge: getAge,
    setAge: setAge
  };
}

var p1 = Person('张三');
p1.setAge(25);
p1.getAge() // 25

//用途3
fun1(() => {
var uid = 1;
  fun2(() => {
    fun3(() => {
       //可以访问uid
    })
  })
});

参考链接:http://javascript.ruanyifeng.com/grammar/function.html#toc22
Node.js开发指南 ByVoid

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、JavaScript函数定义 定义一个函数:JavaScript 使用关键字function 定义函数。当然,...
    聂叼叼阅读 1,170评论 1 6
  • 函数函数定义与调用变量作用域全局变量方法高阶函数闭包箭头函数$generator$ 函数 函数定义与调用 定义函数...
    染微言阅读 629评论 0 5
  • 闭包 闭包(closure)是 JavaScript 语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。...
    Fakecoder_Sunis阅读 296评论 1 0
  • 本文是大神廖雪峰的JavaScript教程学习笔记。并不是教程,如有需要,请前往廖雪峰大神大博客. 一、函数定义和...
    0o冻僵的企鹅o0阅读 512评论 1 3
  • 函数是由这样的方式进行声明的:关键字 function、函数名、一组参数,以及置于括号中的待执行代码。 JavaS...
    Castiel_Z阅读 305评论 0 0