js执行iframe中的函数_JS高级技巧

本文介绍了JS高级技巧,包括安全的类型检测、惰性载入函数、函数绑定和节流技术。在iframe中,使用`Object.prototype.toString.call`可以安全地判断变量类型,避免`instanceof`的问题。惰性载入函数可以优化代码,减少不必要的判断。同时,文章还探讨了函数绑定、柯里化、对象保护以及定时器的使用,特别是函数节流在处理高频事件时的作用。
摘要由CSDN通过智能技术生成

本篇是看的《JS高级程序设计》第23章《高级技巧》做的读书分享。本篇按照书里的思路根据自己的理解和经验,进行扩展延伸,同时指出书里的一些问题。将会讨论安全的类型检测、惰性载入函数、冻结对象、定时器等话题。

1. 安全的类型检测

这个问题是怎么安全地检测一个变量的类型,例如判断一个变量是否为一个数组。通常的做法是使用instanceof,如下代码所示:

let 

但是上面的判断在一定条件下会失败——就是在iframe里面判断一个父窗口的变量的时候。写个demo验证一下,如下主页面的main.html:

<

在iframe.html判断一下父窗口的变量类型:

<

在iframe里面使用window.parent得到父窗口的全局window对象,这个不管跨不跨域都没有问题,进而可以得到父窗口的变量,然后用instanceof判断。最后运行结果如下:

7d4ac0cebb11164b8c690eb6abccf3ae.png

可以看到父窗口的判断是正确的,而子窗口的判断是false,因此一个变量明明是Array,但却不是Array,这是为什么呢?既然这个是父子窗口才会有的问题,于是试一下把Array改成父窗口的Array,即window.parent.Array,如下图所示:

842560acb037963a4df15670305f761a.png

这次返回了true,然后再变换一下其它的判断,如上图,最后可以知道根本原因是上图最后一个判断:

Array !== window.parent.Array

它们分别是两个函数,父窗口定义了一个,子窗口又定义了一个,内存地址不一样,内存地址不一样的Object等式判断不成立,而window.parent.arrayData.constructor返回的是父窗口的Array,比较的时候是在子窗口,使用的是子窗口的Array,这两个Array不相等,所以导致判断不成立。

那怎么办呢?

由于不能使用Object的内存地址判断,可以使用字符串的方式,因为字符串是基本类型,字符串比较只要每个字符都相等就好了。ES5提供了这么一个方法Object.prototype.toString,我们先小试牛刀,试一下不同变量的返回值:

673c9b360a635d759c10cf6ba6983a52.png

可以看到如果是数组返回"[object Array]",ES5对这个函数是这么规定的:

ef0ba12530c172e2bda16f264ab1882d.png

也就是说这个函数的返回值是“[object ”开头,后面带上变量类型的名称和右括号。因此既然它是一个标准语法规范,所以可以用这个函数安全地判断变量是不是数组。

可以这么写:

Object

注意要使用call,而不是直接调用,call的第一个参数是context执行上下文,把数组传给它作为执行上下文。

有一个比较有趣的现象是ES6的class也是返回function:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值