A 函数三种表示方法:
1.函数声明
function foo() {}2.函数表达式
// 2 var foo = function() {};3. new Function()
语法:函数 = new Function(arg1, arg2, ...., argN, functionBody);
注意点:
1 所有的参数都是字符串
2 除了最后一个参数之外,其他的参数都是生成的新函数的参数
function f(a, b, c) { alert(123); }
var f = new Function("a", "b", "c", "alert(123)");
f(); //执行alert(123)
console.log(f instanceof Function); // true
console.log(f.__proto__ === Function.prototype);//true
3.可以看出 函数f 同时也是一个实例对象,此时,所有的函数都是Function的实例。
把函数当作是对象看待,此时,所有的函数都是Function的实例,以下全部都是 true
function Person() {}
console.log(Person instanceof Function);
console.log(Array instanceof Function);
console.log(Date instanceof Function);
console.log(RegExp instanceof Function);
console.log(String instanceof Function);
console.log(Number instanceof Function);
console.log(Boolean instanceof Function);
console.log(Object instanceof Function);
结论:
1. 所有的函数都是Function的实例,函数也是对象
2. 所有的函数(当作对象看)都继承自 Function.prototype
3. Function是构造函数,构造函数也是函数
4. Function 也继承自 Function.prototype,也是被Function创建出来的
B.eval使用
作用:能将字符串当作代码来执行
1.eval('alert(111)') =======等同于页面中写alert(111)
2 . var str = '{ "name": "jim", "age": 19, "gender": "男" }'
var c = eval('('+str+')')
那么,c就转化为一个对象了。有时候在前端写业务逻辑时候发现非常有用
C.静态成员
js的静态成员借鉴了java的静态成员,不需要实例化对象,直接可以用函数调用
如:
function Person() {}
Person.sayHi = function(str) {
alert(str);
};
Person.sayHi(111) //执行alert(111)
D.js 作用域
1 js 是词法作用域,意思是说,变量的作用范围, 在书写代码的时候就已经决定, 与运行时无关。
例如:
var num = 123;
function f1() {
console.log(num);
}
function f2() {
var num = 456;
f1();
}
f2(); //打印结果是123 ,因为f1函数的num在代码写完都已经确定了,这就叫做词法作用域
2 如果函数与变量重名
console.log(f); // function f() {}
function f() {}
var f = 1;
function f() {}
var f = 1;
console.log(f); // 1
如果函数和变量重名,
如果是在赋值之前 打印,此时 结果为 函数
如果是在赋值之后 打印,此时 结果为 变量的值
3 函数参数跟函数体内部的变量重名的情况:
function foo(a) {
var a;
console.log(a);
a = 10;
}
foo(100); //打印结果为100 在打印之后赋值,就为形参的值
function foo(a) {
var a=10;
console.log(a);
}
foo(100); //打印结果为10 在打印之前赋值,就为内部变量的值
function foo(a) {
console.log(a);
function a() {}
}
foo(100); //打印函数体:如果是声明的函数,此时函数会把同名的参数覆盖,此时值为: 函数