1.var
// 反例
myname = "global"; // 全局变量
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析)。
Function
console.log(fun);
var fun=function () {
var a = "aa";
var b = "bb";
}
console.log(fun);
结果:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yMxATNjJ2YlNGZ1cTY2YDM4kDMlJGMyIGN0YTOxEGOz8CX0EzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL5M3Lc9CX6MHc0RHaiojIsJye.png)
可以看出方法的申明就跟上面不一样,感觉function fun就是一个整体。
2)全局变量与隐式全局变量差别:
- 通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。
- 无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。
这表明,在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过
delete
操作符删除的,而变量是不能的:
// 定义三个全局变量
var global_var = 1;
global_novar = 2; // 反面教材
(function () {
global_fromfunc = 3; // 反面教材
}());
// 试图删除
delete global_var; // false
delete global_novar; // true
delete global_fromfunc; // true
// 测试该删除
typeof global_var; // "number"
typeof global_novar; // "undefined"
typeof global_fromfunc; // "undefined"
2.eval Function
Function可以替代eval执行字符串的脚本
console.log(typeof un); // "undefined"
console.log(typeof deux); // "undefined"
console.log(typeof trois); // "undefined"
var jsstring = "var un = 1; console.log(un);";
eval(jsstring); // logs "1"
jsstring = "var deux = 2; console.log(deux);";
new Function(jsstring)(); // logs "2"
jsstring = "var trois = 3; console.log(trois);";
(function () {
eval(jsstring);
}()); // logs "3"
console.log(typeof un); // number
console.log(typeof deux); // "undefined"
console.log(typeof trois); // "undefined"
eval()和Function构造不同的是eval()可以干扰作用域链,而Function()更安分守己些。不管你在哪里执行 Function(),它只看到全局作用域。
由上面可以看出,Function只调用全局作用域 (自己内部变量当然可以)
3.return {}
// 警告: 意外的返回值
function func() {
return
// 下面代码不执行
{
name : "Batman"
}
}
由于隐含分号,函数返回undefined。前面的代码等价于:
// 警告: 意外的返回值
function func() {
return undefined;
// 下面代码不执行
{
name : "Batman"
}
}
正确方式:
function func() {
return {
name : "Batman"
};
}
带return的function实例化和方法调用
由上面可以看出
fun实例化后是一个有name属性的对象
fun调用后返回的是一个字符串
没有return 的function调用返回的是一个undefined
4.自执行
函数声明:
函数表达式:
(function(){...}()) //函数表达式:注意它被包含在分组操作符‘()’中,分组操作符只能包含表达式
(function(){...})();
var abc=/+/new/!/-/&&/~ function(){...}();