资讯专栏INFORMATION COLUMN

【JavaScript】【函数】蛛丝马迹

shinezejian / 2708人阅读

摘要:通过函数声明定义的函数,其是后的标识符通过函数表达式定义的函数,其是空字符串。。函数内部的类数组对象,包含传入函数中的所有参数。返回实际传入函数的参数个数。这个过程有四个步骤创建空对象使的指向构造函数的原型以作为构造函数的上下文调用。

函数属性

name。Firefox、Safari、Chrome、Opera支持这个非标准属性。通过函数声明定义的函数,其namefunction后的标识符;通过函数表达式定义的函数,其name是空字符串。

  var a = function() {};
  var b = new Function();
  function c() {}
  console.log(a.name); //""
  console.log(b.name); //anonymous
  console.log(c.name); //c

prototype。函数原型。

length。返回定义函数的参数个数。

  var a = function(){};
  function b(i) {return i;}
  console.log(a.length); //0
  console.log(b.length); //1    

arguments。函数内部的类数组对象,包含传入函数中的所有参数。可以通过数组下标的方式访问传入函数里的每一个参数。arguments.length返回实际传入函数的参数个数。

  function add() {
      var _length = arguments.length;
      var _init = 0;
      for (var i=0; i<_length; i++) {
          _init += arguments[i];
      } 
      return _init;
  }
  add(1,2,3,4); //10

calleecaller

  function outer() {
      function inner(){
          console.log(arguments.callee.name); //inner
          console.log(arguments.callee.caller.name); //outer
      }
      inner();
  }
  outer();

this函数内部属性。this指的是谁?了解更多。

函数方法

apply()call()

  function sum(num1, num2) {
      return num1 + num2;
  }
  function anotherSum(num1, num2) {
      return sum.apply(this, arguments);
  }
  function yetAnotherSum(num1, num2) {
      return sum.call(this, num1, num2);
  }

  console.log(sum(1,2)); //3
  console.log(anotherSum(1,2)); //3
  console.log(yetAnotherSum(1,2)); //3

bind()

  var window.color = "red";
  var o = {color:"blue"};
  function sayColor() {
      return this.color;
  }
  console.log(sayColor()); //red
  var sayOColor = sayColor.bind(o);
  console.log(sayOColor()); //blue

函数声明提升,使其在加载作用域数据之前(编译阶段)可用。

   //变量声明提升
   console.log(a); //undefined
   var a = 1;
   console.log(a); //1
   //这个过程相当于
   var a;
   console.log(a);
   a = 1;
   console.log(a);

   //函数声明会覆盖同名变量声明
   console.log(typeof x); //function
   function x() {}
   var x;

若传入函数的参数如果是基本类型值,函数操作的是这个参数的副本;若参数是对象,该参数只是这个对象的引用,函数操作的是对象本身。

   var a = 1;
   var b = {value: 1};
   function add(x) {
       (typeof x === "number") ? (x++) : (x.value++);
   };
   add(a);
   add(b);
   console.log(a);  //1
   console.log(b.value); //2

new这个过程有四个步骤

   // new Func();
   var obj = {}; //1.创建空对象
   obj.__proto__ = Func.prototype; //2.使obj的__prototype__指向构造函数的原型
   var ret = Func.call(obj); //3.以obj作为构造函数的上下文调用Func。在为实例构造属性之前,属性值为undefined。
   if (typeof ret == "object") { //4.如果返回的是对象,就会覆盖构造的实例;否则会忽略返回的基本类型值。
       return ret;
   } else {
       return obj;
   }

转载请注明出处:https://segmentfault.com/a/1190000004579488

文章不定期更新完善,如果能对你有一点点启发,我将不胜荣幸。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78851.html

相关文章

  • 理解Node.js的事件轮询

    摘要:实际上官方给出的单线程是具有误导性的。如果开发者在回调函数中调用了阻塞方法比如上文中的函数,那么整个事件轮询就会阻塞,事件队列中的事件得不到及时处理。后记参考文章事件轮询详述 前言 总括 : 原文地址:理解Node.js的事件轮询 Node小应用:Node-sample 智者阅读群书,亦阅历人生 正文 Node.js的两个基本概念 Node.js的第一个基本概念就是I/O操作开销是...

    testHs 评论0 收藏0
  • Django搭建个人博客:改写View视图

    摘要:改写视图函数上一章我们感受了视图的工作流程。循坏表示依次取出中的元素,命名为,并分别执行接下来操作。即为语言,中间包裹了一个段落的文字。有疑问请在杜赛的个人网站留言,我会尽快回复。 改写视图函数 上一章我们感受了视图的工作流程。 为了让视图真正发挥作用,改写article/views.py中的article_list视图函数: article/views.py from django...

    KaltZK 评论0 收藏0
  • flink学习系列--基础知识学习(四)

    摘要:前言这一讲将介绍一下序列化机制和过程函数。然而由于的类型擦除,自动提取并不是总是有效。开发者在自定义类上使用注解,随后创建相应的并覆盖方法。 前言 这一讲将介绍一下序列化机制和过程函数(processfunction)。 序列化机制 使用 Flink 编写处理逻辑时,新手总是容易被林林总总的概念所混淆: 为什么 Flink 有那么多的类型声明方式? BasicTypeInfo.ST...

    piglei 评论0 收藏0
  • PhoneGap极光推送 cordova消息推送

    摘要:之前做过一个用到了消息推送,最近这个项目又用到了推送。限制命名长度限制为字节判断长度需采用编码。参考文献插件文档极光推送文档 前言 说一下写这篇文章的初衷。之前做过一个APP用到了消息推送,最近这个项目又用到了推送。但是由于两个项目间隔4个多月,推送集成、使用方式等都忘了,所以当时又去看了以前项目的源码和一些推送相关的博客,寻找那些蛛丝马迹。突然觉得这样很浪费时间,为何自己不写篇文章总...

    Taste 评论0 收藏0
  • ThinkPHP空操作、空控制器处理

    摘要:比如对于空操作空控制器,你会暴露给给黑客你网站后台所用的框架,黑客会根据框架本省的漏洞对你网站进行攻击。因此,我们需要对空控制器空操作进行处理,不给黑客留下任何蛛丝马迹。好啦,空操作空控制器就先说到这里 当一个高手浏览你的网站的时候,你网站的报错信息将给黑客提供攻击你网站的信息。比如对于空操作、空控制器,你会暴露给给黑客你网站后台所用的框架,黑客会根据框架本省的漏洞对你网站进行攻击。因...

    suxier 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<