JS调用模式与this关键字使用详解

这次给大家带来JS调用模式与this关键字使用详解,JS调用模式与this关键字使用的注意事项有哪些,下面就是实战案例,一起来看一下。

Invocation 调用

调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数。

实参与形参不一致不会导致运行时错误,多的被忽略,少的补为undefined

每个方法都会收到两个附加参数:this和arguments。this的值取决于调用的模式,调用模式:方法,函数,构造器和apply调用模式
this被赋值发生在被调用的时刻。不同的调用模式可以用call方法实现

var myObject = { value: 0, increment: function (inc) { this.value += typeof inc === 'number' ? inc : 1; } }; myObject.double = function(){ var helper = function(){ console.log(this);// this point to window } console.log(this);// this point to object myObject helper(); } myObject.double();//myObject Window

登录后复制

1 The Method Invocation Pattern 方法调用模式

方法:函数被保存为对象的属性.当方法被调用时,this被绑定到该对象

公共方法:通过this取得他们所属对象的上下文的方法

myObject.increment(); document.writeln(myObject.value); //

登录后复制

底层实现: myObject.increment。call(myObject,0);

2 The Function Invocation Pattern 函数调用模式

当函数并非对象的属性时就被当作函数调用(有点废话。。),this被绑定到全局对象(window)

ECMAScript5中新增strict mode, 在这种模式中,为了尽早的暴露出问题,方便调试。this被绑定为undefined

var add = function (a,b) { return a + b;}; var sum = add(3,4);// sum的值为7

登录后复制

底层实现:add.call(window,3,4)

strict mode:add.call(undefined,3,4)

登录后复制

方法调用模式和函数调用模式的区别

function hello(thing) { console.log(this + " says hello " + thing); } person = { name: "Brendan Eich" } person.hello = hello; person.hello("world") // [object Object] says hello world 等价于 person。hello。call(person,“world”) hello("world") // "[object DOMWindow]world" 等价于 hello。call(window,“world”)

登录后复制

3 The Constructor Invocation Pattern

JavaScript是基于原型继承的语言,同时提供了一套基于类的语言的对象构建语法。

this指向new返回的对象

var Quo = function (string) { this.status = string; }; Quo.prototype.get_status = function ( ) { return this.status; }; var myQuo = new Quo("this is new quo"); //new容易漏写,有更优替换 myQuo.get_status( );// this is new quo

登录后复制

4 The Apply Invocation Pattern

apply和call是javascript的内置参数,都是立刻将this绑定到函数,前者参数是数组,后者要一个个的传递apply也是由call底层实现的

apply(this,arguments[]); call(this,arg1,arg2...); var person = { name: "James Smith", hello: function(thing,thing2) { console.log(this.name + " says hello " + thing + thing2); } } person.hello.call({ name: "Jim Smith" },"world","!"); // output: "Jim Smith says hello world!" var args = ["world","!"]; person.hello.apply({ name: "Jim Smith" },args); // output: "Jim Smith says hello world!"

登录后复制

相对的,bind函数将绑定this到函数和调用函数分离开来,使得函数可以在一个特定的上下文中调用,尤其是事件bind的apply实现

Function.prototype.bind = function(ctx){ var fn = this; //fn是绑定的function return function(){ fn.apply(ctx, arguments); }; }; bind用于事件中 function MyObject(element) { this.elm = element; element.addEventListener('click', this.onClick.bind(this), false); }; //this对象指向的是MyObject的实例 MyObject.prototype.onClick = function(e) { var t=this; //do something with [t]... };

登录后复制

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

nodeJS模块使用步骤详解

jQuery插件highslide.js控制图片案例详解

以上就是JS调用模式与this关键字使用详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2767032.html

(0)
上一篇 2025年3月8日 11:30:57
下一篇 2025年3月8日 11:31:09

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS弹窗DIV并整背景颜色变化

    这次给大家带来JS弹窗DIV并整背景颜色变化,JS弹窗DIV并整背景颜色变化的注意事项有哪些,下面就是实战案例,一起来看一下。 1.首先写一个遮罩层p,然后再写一个弹窗的p 提示 js弹窗 js弹出p,并使整个页面背景变暗 确 定 登录后复…

    2025年3月8日
    000
  • AngularJS使用Filter自定义过滤器案列详解

    这次给大家带来AngularJS使用Filter自定义过滤器案列详解,AngularJS使用Filter自定义过滤器的注意事项有哪些,下面就是实战案例,一起来看一下。 本文实例讲述了AngularJS使用Filter自定义过滤器控制ng-r…

    2025年3月8日
    200
  • js实现字符串与数组去重方法

    这次给大家带来js实现字符串与数组去重方法,js实现字符串与数组去重的注意事项有哪些,下面就是实战案例,一起来看一下。 本文实例讲述了JS实现字符串去重及数组去重的方法。分享给大家供大家参考,具体如下: js数组、字符串去重 /*数组去重*…

    2025年3月8日
    200
  • AngularJs如何防止XSS攻击

    这次给大家带来AngularJs如何防止XSS攻击,AngularJs防止XSS攻击的注意事项有哪些,下面就是实战案例,一起来看一下。 概述 XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达…

    编程技术 2025年3月8日
    200
  • JS获取用户当前位置

    这次给大家带来JS获取用户当前位置,JS获取用户当前位置的注意事项有哪些,下面就是实战案例,一起来看一下。 下面一段代码给大家分享js 获取用户所在城市,具体代码如下所述: 获取用户地理位置 $.getScript(‘http://int.…

    编程技术 2025年3月8日
    200
  • Node.Js如何实现比特币地址

    这次给大家带来Node.Js如何实现比特币地址,Node.Js实现比特币地址的注意事项有哪些,下面就是实战案例,一起来看一下。 使用Node.js,IDE采用sublime 3。 var randomBytes = require(‘ran…

    编程技术 2025年3月8日
    200
  • vue.js+element-ui实现树形结构

    这次给大家带来vue.js+element-ui实现树形结构,vue.js+element-ui实现树形结构的注意事项有哪些,下面就是实战案例,一起来看一下。 由于业务需要,要求实现树形菜单,且菜单数据由后台返回,在网上找了几篇文章,看下来…

    2025年3月8日
    200
  • JS装饰器函数使用详解

    这次给大家带来JS装饰器函数使用详解,JS装饰器函数使用的注意事项有哪些,下面就是实战案例,一起来看一下。 在 ES6 中增加了对类对象的相关定义和操作(比如 class 和 extends ),这就使得我们在多个不同类之间共享或者扩展一些…

    编程技术 2025年3月8日
    200
  • JS实现html中placeholder带提示效果

    这次给大家带来JS实现html中placeholder带提示效果,html中placeholder带提示效果的注意事项有哪些,下面就是实战案例,一起来看一下。z 如何通过js实现html的placeholder属性效果呢 我们需要这样做: …

    2025年3月8日
    200
  • JS实现文件拖拽步骤详解

    这次给大家带来JS实现文件拖拽步骤详解,JS实现文件拖拽的注意事项有哪些,下面就是实战案例,一起来看一下。 本文实例为大家分享了javascript实现文件拖拽事件的具体代码,供大家参考,具体内容如下 1.效果图: 2.源码 #p1 { w…

    2025年3月8日
    200

发表回复

登录后才能评论