js 注意点

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);

结果:

 可以看出方法的申明就跟上面不一样,感觉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(){...}();

http://www.f2es.com/javascript-function-expression/

http://www.cnblogs.com/TomXu/archive/2011/12/28/2286877.html

http://www.kankanews.com/ICkengine/archives/33701.shtml

原文地址:https://www.cnblogs.com/hongdada/p/3277336.html