zoukankan      html  css  js  c++  java
  • Java基础学习心得03

    函数

    • 函数的name属性返回函数的名字;
    • 利用toString,可以变相实现多行字符串:
    var multiline = function (fn) {
      var arr = fn.toString().split(‘
    ’);
      return arr.slice(1, arr.length - 1).join(‘
    ’);
    };
    
    function f() {/*
      这是一个
      多行注释
    */}
    
    multiline(f);
    // “ 这是一个
    //   多行注释”
    
    • 注意,对于var命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量;
    • 函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域:
    var a = 1;
    var x = function () {
      console.log(a);
    };
    
    function f() {
      var a = 2;
      x();
    }
    
    f() // 1
    
    //很容易犯错的一点是,如果函数A调用函数B,却没考虑到函数B不会引用函数A的内部变量。
    var B = function () {
      console.log(a);
    };
    
    function A(f) {
      var a = 2;
      f();
    }
    
    A(B)
    // ReferenceError: a is not defined
    
    • 运行时无论提供多少个参数(或者不提供参数),JavaScript 都不会报错。省略的参数的值就变为undefined;
    • 函数的length属性与实际传入的参数个数无关,只反映函数预期传入的参数个数;
    • return不能单独使用,必须在函数中使用;
    • eval最常见的场合是解析 JSON 数据的字符串,不过正确的做法应该是使用原生的JSON.parse方法;

    严格模式与eval配合

    1. 外部作用域的代码无法取得eval内定义的变量:
    (function f() {
      ‘use strict’;
      eval(‘var foo = 123’);
      console.log(foo);  // ReferenceError: foo is not defined
    })()
    
    1. 但是eval可以读写外部作用域的变量的值:
    (function f() {
      ‘use strict’;
      var foo = 1;
      eval(‘foo = 2’);
      console.log(foo);  // 2
    })()
    

    • 为了保证eval的别名不影响代码优化,JavaScript 的标准规定,凡是使用别名执行evaleval内部一律是全局作用域:
    //下面这些形式都是eval的别名调用,作用域都是全局作用域。
    eval.call(null, ‘…’)
    window.eval(‘…’)
    (1, eval)(‘…’)
    (eval, eval)(‘…’)
    
  • 相关阅读:
    P1030 求先序排列 P1305 新二叉树
    spfa
    Clairewd’s message ekmp
    Cyclic Nacklace hdu3746 kmp 最小循环节
    P1233 木棍加工 dp LIS
    P1052 过河 线性dp 路径压缩
    Best Reward 拓展kmp
    Period kmp
    Substrings kmp
    Count the string kmp
  • 原文地址:https://www.cnblogs.com/endymion/p/9192997.html
Copyright © 2011-2022 走看看