目录
1.为什么alert`1`可以弹窗而eval`alert(1)`不能弹窗?
2.加了call方法的eval.call`${`alert(1)`}`和加了call方法的eval.call`alert(1)`同样里面都是字符串为什么一个可以执行一个却不可以执行?
前言
模板字面量是允许嵌入表达式的字符串字面量。你可以使用多行字符串和字符串插值功能在ECMAscript2015.06版本前被统称为模板字符串
1.ECMA
- ecma是前欧洲计算机制造商协会的简称,后来因为计算机的广泛发展,为适应不同国家地域,体现组织的国际性,后来改称为ECMA国际,随着不断的发展,ECMA国际负责的任务也愈来愈加,如ISO-9660文件系统、C语言规范、C++语言标准,JavaScript为基础ecmascript规范等
2.带标签的模板字符串
2.1描述
- 模板字符串可以包含特定语法(
${expression}
)的占位符。占位符中的表达式和周围的文本会一起传递给一个默认函数,该函数负责将所有的部分连接起来,如果一个模板字符串由表达式开头,则该字符串被称为带标签的模板字符串,该表达式通常是一个函数,它会在模板字符串处理后被调用,在输出最终结果前,你都可以通过该函数来对模板字符串进行操作处理模板字符串 - JavaScript | MDN模板字面量 是允许嵌入表达式的字符串字面量。你可以使用多行字符串和字符串插值功能。它们在 ES2015 规范的先前版本中被称为“模板字符串”。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Template_literals#%E8%AF%AD%E6%B3%95
2.2示例
eval`string${表达式}string`
#举例
(1)eval`alert(1)`#模板字符串,里面的alert(1)会被处理后放入数组中直接输出出来
(2)eval`aaa${alert(1)}bbb`
#执行过程:
1.首先执行模板字符串,alert(1)是一个函数被直接执行,而占位符左右的字符串会被处理成一个数组参数,alert(1)执行后的值为另一个参数但是执行后的为空值
2.然后eval开始执行数组参数,又因为数组值为["aaa","bbb"],所以它被原样输出
(3)eval.call`aaa${alert(1)}bbb`
#这里执行步骤为:
1.首先执行模板字符串,因为这里的占位符中是一个函数所以被直接执行,同时模板字符串会生成两个参数,一个参数是占位符左右的字符数组(["aaa","bbb"]),一个参数是alert(1)执行后的返回值
2.模板字符串生成的参数符合call语法(["aaa","bbb"],null)因为alert(1)被直接调用执行并没有返回值所以这里为空null
3.e