RxJs学习笔记1--js基础知识--函数

函数的声明与定义

方式1:

function print(s) {
  console.log(s);
}

方式2:

var print = function(s) {
  console.log(s);
};
 //方式2定义函数,如果使用了函数名,如下面代码的x,函数名在函数体外边无效。
var print = function x(){
  console.log(typeof x);
};
X;// ReferenceError: x is not defined

方式3:不推荐使用

var foo = new Function(
  'return "hello world"'
);

函数的调用

函数名加()表示还是调用,() 中间

function add(x, y) {
  return x + y;
}

add(1, 1) 

第一等公民

JavaScript 语言将函数看作一种值,与其它值(数值、字符串、布尔值等等)地位相同。凡是可以使用值的地方,就能使用函数。比如,可以把函数赋值给变量和对象的属性,也可以当作参数传入其他函数,或者作为函数的结果返回。函数只是一个可以执行的值,此外并无特殊之处。

函数名提升

JavaScript 引擎将函数名视同变量名,所以采用function命令声明函数时,整个函数会像变量声明一样,被提升到代码头部。所以,下面的代码不会报错。

f();

function f() { ... }

获取函数信息

  1. name属性获取函数的名字
function f1() {}
f1.name 
// -----
var f2 = function () {};
f2.name 
  1. length属性获取 函数定义之中的参数个数。
    length属性提供了一种机制,判断定义时和调用时参数的差异,以便实现面向对象编程的”方法重载“(overload)。
function f(a, b) {}
f.length // 2
  1. toString方法返回一个字符串,内容是函数的源码。带// 注释
function f() {
  a();
  b();
  c();
}

f.toString()
// function f() {
//  a();
//  b();
//  c();
// }

作用域

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

  1. 在函数内部定义的变量,外部无法读取,称为“局部变量”(local variable)。
  2. 函数外部声明的变量就是全局变量(global variable),它可以在函数内部读取。
  3. 函数本身也是一个值,也有自己的作用域。它的作用域与变量一样,由其声明所在的位置决定。

同名参数

同名参数,最后面的覆盖前面的,前面的无效。

function f(a, a) {
  console.log(a);
}

f(1, 2) // 2

arguments 对象

由于 JavaScript 允许函数有不定数目的参数,在内部是由 arguments对象机制实现的。
arguments对象包含了函数运行时的所有参数,arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。这个对象只有在函数体内部,才可以使用。

var f = function (one) {
  console.log(arguments[0]);
  console.log(arguments[1]);
  console.log(arguments[2]);
}

f(1, 2, 3)
//输出1,2,3

js闭包

由于在 JavaScript 语言中,只有函数内部的子函数才能读取内部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。

function f1() {
  var n = 999;
  function f2() {
    console.log(n);
  }
  return f2;
}

var result = f1();
result(); 

上面代码中,函数f1的返回值就是函数f2,由于f2可以读取f1的内部变量,所以就可以在外部获得f1的内部变量了。
闭包就是函数f2,即定义在某函数内部,读取该函数内部变量的函数。

立即执行函数

// 写法一
var tmp = newData;
processData(tmp);
storeData(tmp);

// 写法二
(function () {
  var tmp = newData;
  processData(tmp);
  storeData(tmp);
}());

有时,我们需要在定义函数之后,立即调用该函数。这时,你不能在函数的定义之后加上圆括号,这会产生语法错误。
产生这个错误的原因是,JavaScript 引擎规定,如果function关键字出现在行首,一律解释成语句。因此,行首是function关键字,引擎认为这是函数的定义语句,不应该以圆括号结尾,所以就报错了。解决方法就是不要让function出现在行首,按表达式处理函数定义。最简单的方法,就是将其放在一个圆括号里面。

(function(){ /* code */ })();

eval命令

eval命令接受一个字符串作为参数,并将这个字符串当作语句执行。

你可能感兴趣的:(RxJs学习笔记1--js基础知识--函数)