完美解决IE低版本不支持call与apply的问题

Function.prototype的apply和call是在1999年发布的ECMA262 Edition3中才加入的(1998年发布ECMA262 Edition2)。在此前的的浏览器如IE5.01(JScript 5.0)中是没有apply和call的。因此会带来一些兼容性问题,以下是修复方式:


代码如下:

if(!Function.prototype.apply){
    Function.prototype.apply = function(obj, args){
        obj = obj == undefined ? window : Object(obj);//obj可以是js基本类型
        var i = 0, ary = [], str;
        if(args){
            for( len=args.length; i<len; i++ ){
                ary[i] = "args[" + i + "]";
            }
        }
        obj._apply = this;
        str = 'obj._apply(' + ary.join(',') + ')';
        try{
            return eval(str);
        }catch(e){
        }finally{
            delete obj._apply;
        }   
    };
}
if(!Function.prototype.call){
    Function.prototype.call = function(obj){
        var i = 1, args = [];
        for( len=arguments.length; i<len; i++ ){
            args[i-1] = arguments[i];
        }
        return this.apply(obj, args);
    };
}

(0)

相关推荐

  • javascript中call和apply方法浅谈

    call和apply的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用.例如,如果要想以对象o的方法来调用函数f,可以按如下的方式使用call和apply方法: 复制代码 代码如下: f.call(o); f.apply(o); 可以按如下的代码来理解: 复制代码 代码如下: o.m = f; //将f存储为o的临时方法 o.m(); //调用这个临时方法 delete o.m; //将这个临时方法删除 来个示例吧. 复制代码 代码如下: function

  • Javascript call和apply区别及使用方法

    一.方法的定义call方法: 语法:fun.call(thisArg[, arg1[, arg2[, ...]]])定义:调用一个对象的一个方法,以另一个对象替换当前对象.说明:call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisArg 指定的新对象.如果没有提供 thisArg参数,那么 Global 对象被用作 thisArg. apply方法:语法:fun.apply(thisArg[, argsArray])定义:应用某

  • javascript call和apply方法

    例子如下: 复制代码 代码如下: <script> /** *动物 */ function Animal(){ this.name='Amimal'; this.showName=function(){ alert(this.name); }; } /* *猫 */ function Cat(){ this.name='cat'; } var animal=new Animal;//创建动物对象 var cat=new Cat;//创建猫对象 animal.showName.call(cat,

  • Javascript 中的 call 和 apply使用介绍

    简单的说就是改变函数执行的上下文,这是最基本的用法.两个方法基本区别在于传参不同. call(obj,arg1,arg2,arg3);call第一个参数传对象,可以是null.参数以逗号分开进行传值,参数可以是任何类型. apply(obj,[arg1,arg2,arg3]);apply第一个参数传对象,参数可以是数组或者arguments 对象. 这两个方法通常被用来类的继承和回调函数: 作用一.类的继承: 先来看这个例子: 复制代码 代码如下: function Person(name,ag

  • 完美解决IE低版本不支持call与apply的问题

    Function.prototype的apply和call是在1999年发布的ECMA262 Edition3中才加入的(1998年发布ECMA262 Edition2).在此前的的浏览器如IE5.01(JScript 5.0)中是没有apply和call的.因此会带来一些兼容性问题,以下是修复方式: 复制代码 代码如下: if(!Function.prototype.apply){     Function.prototype.apply = function(obj, args){     

  • vue 解决IOS10低版本白屏的问题

    新公司是做自己的独立产品,比之前呆过的外包公司要求严格的多,注重用户体验,以下是在新项目里进行前端优化的一些操作 一,低版本空白屏问题,以及ios8的样式问题 本项目是通过vue-cli搭建,上线以后运行在新版本的苹果手机和安卓手机上均无问题.但是在ios8 9上出现了空白屏的原理,经过测试以后发现是低版本不兼容es6的语法,经过几番尝试找到了最优解. 1 空白屏问题 首先安装babel-polyfill,安装命令:npm install --save-dev babel-polyfill 安装

  • jQuery封装placeholder效果实现方法,让低版本浏览器支持该效果

    页面中的输入框默认的提示文字一般使用placeholder属性就可以了,即: <input type="text" name="username" placeholder="请输入用户名" value="" id="username"/> 最多加点样式控制下默认文字的颜色 input::-webkit-input-placeholder{color:#AAAAAA;} 但是在低版本的浏览器却不支

  • 解决IE7以下版本不支持无A状态伪类的几种方法

    在IE7以下版本一直是不支持无A状态伪类的,通常都要靠Javascript来解决的,最近经常有人问起此类问题,故整理了几种方法,脚本来自国外网站,供大家参考. 方法一 javascript文件,来自Htmldog . 复制代码 代码如下: function suckerfish(type, tag, parentId) {     if (window.attachEvent) {         window.attachEvent("onload", function() {   

  • 让低版本浏览器支持input的placeholder属性(js方法)

    复制代码 代码如下: var doc = window.document, input = doc.createElement('input'); if( typeof input['placeholder'] == 'undefined' ) // 如果不支持placeholder属性 { $('input').each(function( ele ) { var me = $(this); var ph = me.attr('placeholder'); if( ph && !me.v

  • MySQL版本低了不支持两个时间戳类型的值解决方法

    MySQL报错:错误代码: 1293 Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP 原因是:两台服务器的mysql版本不一致. 低版本不支持在一个表里面 有2个TIMESTAMP 类型 的列. 项目中版本是: 配置环境(推荐jdk8,mysql5.7,maven3,想法) 我的是5.52 解决方法? 是采用把2台服务器都使用最新的版本这个办法 以上方法很简单,感谢

  • 解决低版本的浏览器不支持es6的import问题

    解决方法: 1. <script type="model" src="game.js"></script> 2. 下载最新版本的chrome浏览器 以上这篇解决低版本的浏览器不支持es6的import问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 解决Python3.7.0 SSL低版本导致Pip无法使用问题

    终于下决心把python从2.7升到了3.7.懒人安装当然使用Anaconda. 安装成功,编译成功.但是用pip 安装包的时候提示: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. 原因是python3.7为了安全性考虑,要求使用openssl 1.0.2之后的版本.但是自带的openssl,版本是1.0.1. 解决办法: 重装一下

  • 完美解决Jpush[获取sdk版本失败!]的问题

    错误日志如下: 5-31 12:47:40.088 23896-23896/? E/JIGUANG-JCore: [JCoreGlobal] Get sdk version fail![获取sdk版本失败!] 05-31 12:47:40.088 23896-23896/? W/System.err: java.lang.UnsatisfiedLinkError: Native method not found: cn.jiguang.service.Protocol.GetSdkVersion

  • Java程序实现导出Excel的方法(支持IE低版本)

    今天想整理一下自己前段时间遇到的一个导出的问题. 因为项目的需求,要做一部分导出功能.开始的时候用的公司的导出,但是很奇怪有部分模块导出的时候就是会报500错误,发现在删减一些字段后就恢复了正常,当时因为项目紧张,也就临时删减了一些,但也不是长久之计,之后自己在原本的基础上重新修改整理了一下,目前运行还算稳定,就此和大家分享一下. 导出需要三个部分,js,公共方法,后台方法. js代码 function exportData() { //前台接收的参数 rwmc = $("#txt_rwmc&q

随机推荐