diff options
| author | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:40:17 -0500 |
|---|---|---|
| committer | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:40:17 -0500 |
| commit | 33058f2b292b3a581333bdfb21b8f671898c5060 (patch) | |
| tree | 51c3e392513ec574331b2d3f85c394445ea803c6 /files/zh-cn/web/javascript/reference/errors/not_a_function | |
| parent | 8b66d724f7caf0157093fb09cfec8fbd0c6ad50a (diff) | |
| download | translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.gz translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.bz2 translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.zip | |
initial commit
Diffstat (limited to 'files/zh-cn/web/javascript/reference/errors/not_a_function')
| -rw-r--r-- | files/zh-cn/web/javascript/reference/errors/not_a_function/index.html | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/files/zh-cn/web/javascript/reference/errors/not_a_function/index.html b/files/zh-cn/web/javascript/reference/errors/not_a_function/index.html new file mode 100644 index 0000000000..fc4f664e1d --- /dev/null +++ b/files/zh-cn/web/javascript/reference/errors/not_a_function/index.html @@ -0,0 +1,167 @@ +--- +title: 'TypeError: "x" is not a function' +slug: Web/JavaScript/Reference/Errors/Not_a_function +tags: + - Errors + - JavaScript + - TypeError +translation_of: Web/JavaScript/Reference/Errors/Not_a_function +--- +<div>{{jsSidebar("Errors")}}</div> + +<div>JavaScript异常"is not a function"会在试图去调用一个像函数一样的值,但是该值实际上不是函数时被抛出.</div> + +<h2 id="信息">信息</h2> + +<pre class="notranslate">TypeError: Object doesn't support property or method {x} (Edge) +TypeError: "x" is not a function</pre> + +<h2 id="错误类型">错误类型</h2> + +<p>{{jsxref("TypeError")}}</p> + +<h2 id="哪里出错了">哪里出错了?</h2> + +<p>问题出在你试图去调用一个像函数一样的值,但是该值实际上不是函数,有时候你的代码需要调用一些函数,但是那种值并不能当作函数来被调用。</p> + +<p>也许函数名称上有错别字? 也许你正在调用Object对象没有这个方法? 例如,在JavaScript中单纯的对象(Object)没有<strong>map</strong>函数,但是JavaScript数组(Array)对象却有这个函数。</p> + +<p>再比如,在JavaScript中很多原生对象的内置方法需要你提供一个(回调)函数。 所以你必须提供一个函数,以使这些方法正常工作:</p> + +<ul> + <li>当你在使用 {{jsxref("Array")}} 或 {{jsxref("TypedArray")}} 对象时: + <ul> + <li>{{jsxref("Array.prototype.every()")}}, {{jsxref("Array.prototype.some()")}}, {{jsxref("Array.prototype.forEach()")}}, {{jsxref("Array.prototype.map()")}}, {{jsxref("Array.prototype.filter()")}}, {{jsxref("Array.prototype.reduce()")}}, {{jsxref("Array.prototype.reduceRight()")}}, {{jsxref("Array.prototype.find()")}}</li> + </ul> + </li> + <li>当你在使用 {{jsxref("Map")}} 和 {{jsxref("Set")}} 对象时: + <ul> + <li>{{jsxref("Map.prototype.forEach()")}} and {{jsxref("Set.prototype.forEach()")}}</li> + </ul> + </li> +</ul> + +<h2 id="例子">例子</h2> + +<h3 id="函数的名称错误">函数的名称错误</h3> + +<p>函数的名称拼写错误,这种情况是经常发生的:</p> + +<pre class="brush: js example-bad notranslate">var x = document.getElementByID("foo"); +// TypeError: document.getElementByID is not a function +</pre> + +<p>正确的方法名应该是 <code>getElementByI<strong>d:</strong></code></p> + +<pre class="brush: js example-good notranslate">var x = document.getElementById("foo"); +</pre> + +<h3 id="调用Object类型中不存在的方法">调用Object类型中不存在的方法</h3> + +<p>对于某些特殊的方法,它只属于某些特定的原生对象中,你必须提供一个回调函数才能正常运行。例如:这里调用了一个 {{jsxref("Array.prototype.map()")}} 方法,但是这方法只能被 {{jsxref("Array")}} 对象所调用。 </p> + +<pre class="brush: js example-bad notranslate">var obj = { a: 13, b: 37, c: 42 }; + +obj.map(function(num) { + return num * 2; +}); + +// TypeError: obj.map is not a function</pre> + +<p>正确的做法,使用一个数组来代替:</p> + +<pre class="brush: js example-good notranslate">var numbers = [1, 4, 9]; + +numbers.map(function(num) { + return num * 2; +}); + +// Array [ 2, 8, 18 ] +</pre> + +<h3 id="函数与已有属性重名">函数与已有属性重名</h3> + +<p>当您在创建类时,可能会存在某个属性和某个方法的名称相同,当您在调用该函数时,编译器会认为该函数不存在.</p> + +<pre class="brush: js example-bad notranslate">var Dog = function () { + this.age = 11; + this.color = "black"; + this.name = "Ralph"; + return this; +} + +Dog.prototype.name = function(name) { + this.name = name; + return this; +} + + +var myNewDog = new Dog(); +myNewDog.name("Cassidy"); //Uncaught TypeError: myNewDog.name is not a function +</pre> + +<p>正确的做法是使用不同的变量名.</p> + +<pre class="brush: js example-good notranslate">var Dog = function () { + this.age = 11; + this.color = "black"; + this.dogName = "Ralph"; //Using this.dogName instead of .name + return this; +} + +Dog.prototype.name = function(name) { + this.dogName = name; + return this; +} + + +var myNewDog = new Dog(); +myNewDog.name("Cassidy"); //Dog { age: 11, color: 'black', dogName: 'Cassidy' }</pre> + +<h3 id="使用括号进行乘法运算">使用括号进行乘法运算</h3> + +<p>在数学中,您可以将 2 × (3 + 5) 写为 2*(3 + 5) 或者省略为 2(3 + 5).</p> + +<p>使用后者时将会抛出错误:</p> + +<pre class="brush: js example-bad notranslate">const sixteen = 2(3 + 5); +alert('2 x (3 + 5) is ' + String(sixteen)); +//Uncaught TypeError: 2 is not a function</pre> + +<p>您可以添加乘法运算符 <code>*</code> 来改正代码:</p> + +<pre class="brush: js example-good notranslate">const sixteen = 2 * (3 + 5); +alert('2 x (3 + 5) is ' + String(sixteen)); +//2 x (3 + 5) is 16</pre> + +<h3 id="正确地导入和导出模块">正确地导入和导出模块</h3> + +<p>确保正确导入模块.</p> + +<p>以下为一个示例模块 (<code>helpers.js</code>)</p> + +<pre class="notranslate">let helpers = function () { }; + +helpers.groupBy = function (objectArray, property) { + return objectArray.reduce(function (acc, obj) { + var key = obj[property]; + if (!acc[key]) { + acc[key] = []; + } + acc[key].push(obj); + return acc; + }, +{}); +} + +export default helpers;</pre> + +<p>在 <code>App.js</code>中正确导入该模块:</p> + +<pre class="notranslate">import helpers from './helpers'</pre> + +<h2 id="相关">相关</h2> + +<ul> + <li><a href="/en-US/docs/Web/JavaScript/Reference/Functions">Functions</a></li> +</ul> |
