JavaScript 中使用 new Function 执行字符串拼接表达式

作者 @zwhu
原文章 @github

最近在用 node 学写爬虫,也可以叫模拟登陆,遇到某个网站在返回的 HTML 中插入了一个生成页面token的script。

这个HTML的结构大概类似

<!Doctype html>
<html>
    <head></head>
    <body>
        <div></div>
        <script>       
            (function (w) {
                w.token = (function () {
                    // ....
                    // 生成token
        
                return token;
                })();;
            })(window);
        </script>
    </body>
</html>

首先拿到这个页面,然后获取script标签的表达式字符串,剩下的事就是怎样执行表达式字符串,并获取token。

在此处的情景中用eval也是挺不错的选择,但是既然 JS 不推荐这种用法,那我们就换成 new Function 来做。

看下 new Function 的用法如下

new Function ([arg1[, arg2[, ...argN]],] functionBody)

new Function会返回一个函数。例如 fn = new Function('a', 'b', 'return a + b') 会返回一个函数对象

fn = function(a, b) {
    return a + b
}

so,我们可以使用 new Function 构造一个函数,用来执行获取到得表达式,并返回token。

    fn = new Function('window', functionBody + ';return window.token')
    var token = fn({})
    console.log(token)

构造的这个函数有个window形参,作为函数体中立即执行表达式的实参传入最内层的函数中。所以在最后执行的时候 return window.token 便会获得token 的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值