1-JavaScript-函数和作用域

  • 1 arguments 函数可以作为一个变量

arguments --- 一般用于参数的个数的判断
JavaScript还有一个免费赠送的关键字arguments,它只在函数内部起作用,并且永远指向当前函数的调用者传入的所有参数。arguments类似Array但它不是一个Array:

function foo(x) {
    alert(x); // 10
    for (var i=0; i<arguments.length; i++) {
        alert(arguments[i]); // 10, 20, 30
    }
}
foo(10, 20, 30);
  • 2 rest (rest和arguments都是可以看作array数组)

为了获取除了已定义参数a、b之外的参数,我们不得不用arguments,并且循环要从索引2开始以便排除前两个参数,这种写法很别扭,只是为了获得额外的rest参数,有没有更好的方法?

++当我们要使用很多个参数的时候使用rest,比如sum多个数求和++

function foo(a, b) {
  var i, rest = [];
  if (arguments.length > 2) {
      for (i = 2; i<arguments.length; i++) {
          rest.push(arguments[i]);
      }
  }
  console.log('a = ' + a);
  console.log('b = ' + b);
  console.log(rest);
}
foo(10,20)
  • 测试rest使用方法

    function sum(...rest) {
    var sum=0;
       for(var i in rest){
        sum = rest[i] + sum; 
    }
    return sum;
    }
    // 测试:
    var i, args = [];
    for (i=1; i<=100; i++) {
        args.push(i);
    }
    if (sum() !== 0) {
        alert('测试失败: sum() = ' + sum());
    } else if (sum(1) !== 1) {
        alert('测试失败: sum(1) = ' + sum(1));
    } else if (sum(2, 3) !== 5) {
        alert('测试失败: sum(2, 3) = ' + sum(2, 3));
    } else if (sum.apply(null, args) !== 5050) {
        alert('测试失败: sum(1, 2, 3, ..., 100) = ' + sum.apply(null, args));
    } else {
        alert('测试通过!');
    }
    
  • 另外一个测试

    'use strict';
    
    function area_of_circle(r, pi) {
    
        return (arguments.length===2)? pi*r*r : 3.14*r*r;
    
    }
    // 测试:
    if (area_of_circle(2) === 12.56 && area_of_circle(2, 3.1416) === 12.5664) {
        alert('测试通过');
    } else {
        alert('测试失败');
    }
  • 3 作用域

    • 变量提升

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


'use strict';

function foo() {
    var x = 'Hello, ' + y;
    alert(x);
    var y = 'Bob';
}

foo();
  • 全局作用域

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

'use strict';

var course = 'Learn JavaScript';
alert(course); // 'Learn JavaScript'
alert(window.course); // 'Learn JavaScript'
因此,直接访问全局变量course和访问window.course是完全一样的。

你可能猜到了,由于函数定义有两种方式,以变量方式var foo = function () {}定义的函数实际上也是一个全局变量,因此,顶层函数的定义也被视为一个全局变量,并绑定到window对象:

'use strict';

function foo() {
    alert('foo');
}

foo(); // 直接调用foo()
window.foo(); // 通过window.foo()调用
  • 4名字空间

全局变量会绑定到window上,不同的JavaScript文件如果使用了相同的全局变量,或者定义了相同名字的顶层函数,都会造成命名冲突,并且很难被发现。

减少冲突的一个方法是把自己的所有变量和函数全部绑定到一个全局变量中。例如:

// 唯一的全局变量MYAPP:
var MYAPP = {};

// 其他变量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;

// 其他函数:
MYAPP.foo = function () {
    return 'foo';
};

把自己的代码全部放入唯一的名字空间MYAPP中,会大大减少全局变量冲突的可能。
许多著名的JavaScript库都是这么干的:jQuery,YUI,underscore等等。

- 使用const,let来解块级作用域的问题
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 函数就是最基本的一种代码抽象的方式。 定义函数function abs(x) {if (x >=0){return...
    _我和你一样阅读 3,290评论 0 0
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,790评论 0 4
  • 第一章: JS简介 从当初简单的语言,变成了现在能够处理复杂计算和交互,拥有闭包、匿名函数, 甚至元编程等...
    LaBaby_阅读 5,627评论 0 6
  • 1. 当用户已经沉浸在你的App场景中,无论是何种需求需要使用到查收短信功能, 都可以在文案上有这类别出心裁的小设...
    郑义同学阅读 7,581评论 0 2
  • 不是我们看到了希望才去坚持,而是我们坚持了才看到希望。 昨天在朋友圈发了一条关于“面”的动态,大体是激动于学校餐厅...
    周公子ZGZ阅读 5,734评论 0 4

友情链接更多精彩内容